2.3 宣言
宣言によって、指定されたデータ型の値の記憶域を割り当て、値を参照できるように格納場所に名前を付けます。
オブジェクトは、参照する前に宣言しておく必要があります。宣言は、任意のブロック、サブプログラムまたはパッケージの宣言部で使用できます。
ここでのトピック
変数と定数以外のオブジェクトの宣言の詳細は、「ブロック」のdeclare_sectionの構文を参照してください。
2.3.1 NOT NULL制約
スカラー変数または定数(またはコンポジット変数または定数のスカラー・コンポーネント)には、NOT NULL制約を指定できます。
NOT NULL制約を指定すると、その項目にNULL値を代入できなくなります。この制約は、(データ型から)暗黙的に指定するか、または明示的に指定することができます。
NOT NULLを指定するスカラー変数の宣言では、暗黙的か明示的かに関係なく、初期値を変数に代入する必要があります(スカラー変数のデフォルトの初期値はNULLであるため)。
PL/SQLは長さが0(ゼロ)の文字値をすべてNULL値とみなします。これには文字関数やブール式によって戻された値が含まれます。
NULL値かどうかをテストするには、「IS [NOT] NULL演算子」を使用します。
例
例2-9 NOT NULL制約が指定された変数の宣言
この例では、変数acct_idにNOT NULL制約を明示的に指定し、変数a、bおよびcにはデータ型から暗黙的に指定します。
DECLARE acct_id INTEGER(4) NOT NULL := 9999; a NATURALN := 9999; b POSITIVEN := 9999; c SIMPLE_INTEGER := 9999; BEGIN NULL; END; /
例2-10 NULL値に初期化される変数
この例では、すべての変数がNULLに初期化されます。
DECLARE
null_string VARCHAR2(80) := TO_CHAR('');
address VARCHAR2(80);
zip_code VARCHAR2(80) := SUBSTR(address, 25, 0);
name VARCHAR2(80);
valid BOOLEAN := (name != '');
BEGIN
NULL;
END;
/
2.3.2 変数の宣言
変数の宣言では、変数の名前とデータ型を常に指定します。
ほとんどのデータ型の場合、変数を宣言するときに初期値を指定することもできます。
変数名は、有効なユーザー定義の識別子である必要があります。
データ型は、任意のPL/SQLデータ型を選択できます。PL/SQLデータ型にはSQLデータ型が含まれます。データ型は、スカラー(内部コンポーネントなし)またはコンポジット(内部コンポーネントあり)のいずれかです。
例
例2-11 スカラー変数の宣言
この例では、いくつかの変数をスカラー・データ型で宣言しています。
DECLARE part_number NUMBER(6); -- SQL data type part_name VARCHAR2(20); -- SQL data type in_stock BOOLEAN; -- PL/SQL-only data type part_price NUMBER(6,2); -- SQL data type part_description VARCHAR2(50); -- SQL data type BEGIN NULL; END; /
関連トピック
-
スカラー変数の宣言の構文は、「スカラー変数の宣言」を参照してください
-
スカラーのデータ型の詳細は、「PL/SQLのデータ型」を参照してください
-
コンポジット・データ型およびコンポジット変数の詳細は、「PL/SQLのコレクションおよびレコード」を参照してください
2.3.3 定数の宣言
定数は、変更されない値を保持します。
「変数の宣言」の内容は定数の宣言にも当てはまりますが、定数の宣言には必要なものがさらに2つ(キーワードCONSTANTと定数の初期値)あります。(定数の初期値は永続的な値になります。)
例2-12 定数の宣言
この例では、3つの定数をスカラー・データ型で宣言しています。
DECLARE credit_limit CONSTANT REAL := 5000.00; -- SQL data type max_days_in_year CONSTANT INTEGER := 366; -- SQL data type urban_legend CONSTANT BOOLEAN := FALSE; -- PL/SQL-only data type BEGIN NULL; END; /
関連トピック
-
定数の宣言の構文は、「定数の宣言」を参照してください
2.3.4 変数および定数の初期値
変数宣言では、NOT NULL制約を指定しないかぎり、初期値はオプションです。定数の宣言では、初期値は必須です。
ブロックまたはサブプログラムに宣言が含まれている場合は、ブロックまたはサブプログラムに制御が渡されるたびに、変数または定数に初期値が代入されます。宣言がパッケージ仕様部にある場合は、(変数または定数がパブリックかプライベートかには関係なく)セッションごとに初期値が変数または定数に代入されます。
初期値を指定するには、代入演算子(:=)またはキーワードDEFAULTを使用し、その後に式を指定します。式には、事前に宣言済の定数と、事前に初期化済の変数を使用できます。
変数に初期値を指定しない場合は、他のコンテキストで使用する前に、値を代入します。
例
例2-13 初期値が指定された変数および定数の宣言
この例では、宣言する定数および変数に初期値を代入します。areaの初期値は、事前に宣言済の定数piおよび事前に初期化済の変数radiusに応じて異なります。
DECLARE hours_worked INTEGER := 40; employee_count INTEGER := 0; pi CONSTANT REAL := 3.14159; radius REAL := 1; area REAL := (pi * radius**2); BEGIN NULL; END; /
例2-14 デフォルトでNULLに初期化される変数
この例では、変数counterの初期値はデフォルトのNULLです。この例では、「IS [NOT] NULL演算子」を使用して、NULLがゼロとは異なることを示しています。
DECLARE counter INTEGER; -- initial value is NULL by default BEGIN counter := counter + 1; -- NULL + 1 is still NULLIF counter IS NULL THENDBMS_OUTPUT.PUT_LINE('counter is NULL.');END IF;END; /
結果:
counter is NULL.
関連トピック
-
定数の連想配列の宣言の詳細は、「連想配列の定数の宣言」を参照してください
-
定数レコードの宣言の詳細は、「レコード定数の宣言」を参照してください
2.3.5 %TYPE属性を使用した項目の宣言
%TYPE属性を使用すると、事前に宣言されている変数または列と同じデータ型のデータ項目を(データ型を知らなくても)宣言できます。参照先項目の宣言が変更されると、それに応じて参照元項目の宣言も変更されます。
次に宣言の構文を示します。
referencing_item referenced_item%TYPE;
参照元項目および参照先項目にすることができる項目の種類は、「%TYPE属性」を参照してください。
参照元項目は、参照先項目から次のものを継承します。
-
データ型およびサイズ
-
制約(参照先項目が列である場合を除く)
参照元項目は、参照先項目の初期値は継承しません。そのため、参照元項目でNOT NULL制約が指定または継承される場合は、参照元項目の初期値を指定する必要があります。
%TYPE属性は、データベースの値を保持する変数を宣言する場合に特に便利です。列と同じ型の変数を宣言する構文は、次のようになります。
variable_name table_name.column_name%TYPE;
関連項目:
「%ROWTYPE属性を使用した項目の宣言」(この属性を使用すると、データベースの表またはビュー内の行の全体または一部を表すレコード変数を宣言できます)
例
例2-15 列と同じ型の変数の宣言
この例では、変数surnameは、NOT NULL制約が指定されている列employees.last_nameのデータ型とサイズを継承しています。surnameはNOT NULL制約を継承しないため、その宣言に初期値は不要です。
DECLARE
surname employees.last_name%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('surname=' || surname);
END;
/
結果:
surname=
例2-16 別の変数と同じ型の変数の宣言
この例では、変数surnameは変数nameのデータ型、サイズおよびNOT NULL制約を継承しています。surnameはnameの初期値を継承しないため、その宣言には初期値(25文字以内)が必要です。
DECLARE
name VARCHAR(25) NOT NULL := 'Smith';
surname name%TYPE := 'Jones';
BEGIN
DBMS_OUTPUT.PUT_LINE('name=' || name);
DBMS_OUTPUT.PUT_LINE('surname=' || surname);
END;
/
結果:
name=Smith surname=Jones