指定したデータ型の値に格納領域を割り当て、参照しやすいように格納場所に名前を付けます。
オブジェクトを参照する前に、まず宣言する必要があります。宣言は、任意のブロック、サブプログラム、またはパッケージの宣言部に記述できます。
機能の適用範囲
この内容はOceanBaseデータベースEnterprise Editionにのみ適用されます。OceanBaseデータベースCommunity EditionはMySQLモードのみを提供します。
NOT NULL制約
変数または定数のスカラー(または複合変数または複合定数のスカラー成分)にNOT NULL制約を適用できます。
NOT NULL制約により、オブジェクトにNULL値を代入することを防ぎます。オブジェクトのNOT NULL属性は、暗黙的または明示的に指定できます。
スカラー変数の宣言では、NOT NULLを暗黙的または明示的に指定できます。NOT NULLを指定する場合は、初期値を代入する必要があります(スカラー変数のデフォルトの初期値はNULLだからです)。
PLは、文字関数やBOOLEAN式の戻り値を含め、長さゼロの文字列をすべてNULL値と見なします。
変数の宣言
変数宣言では、変数の名前とデータ型を指定する必要があります。ほとんどのデータ型では、変数宣言時に初期値も指定できます。
変数名は有効なユーザー定義識別子である必要があります。データ型は任意のPLデータ型でかまいません。PLデータ型にはすべてのSQLデータ型が含まれます。データ型はスカラー型と複合型があります。
定数の宣言
定数は変更されない値を保持するために使用されます。
変数宣言に関する情報は定数宣言にも適用されますが、定数宣言には2つの要件が追加されます:キーワードCONSTANTと定数の初期値(定数の初期値はその永久的な値です)。
変数と定数の初期値
変数宣言では、NOT NULL制約を指定しない限り、初期値はオプションです。定数宣言では、初期値が必要です。
宣言がブロックまたはサブプログラム内にある場合、ブロックまたはサブプログラムが実行されるたびに、変数または定数に初期値が代入されます。宣言がパッケージのSPECIFICATION内にある場合、初期値は各セッションの変数または定数(変数または定数が公開変数であるかプライベート変数であるかに関係なく)に代入されます。
初期値を指定するには、代入演算子(:=)またはキーワードDEFAULTを使用し、その後に式を続けます。この式には、以前に宣言された定数や初期化済みの変数を含めることができます。変数に初期値が指定されていない場合は、変数を使用する前に値を代入してください。
例:
obclient> DECLARE
pi CONSTANT NUMBER := 3.14159;
radius NUMBER NOT NULL := 1;
area NUMBER := (pi * radius**2);
BEGIN
DBMS_OUTPUT.PUT_LINE('The area of the circle is: '||area);
END;
/
Query OK, 0 rows affected
The area of the circle is: 3.14159
%TYPE宣言の使用
%TYPE は、事前に宣言された変数や列と同じデータ型を持つオブジェクトを宣言することができます(その型が何であるかを知る必要はありません)。
%TYPE 機能を使用する利点は以下のとおりです:
引用されるデータベース列のデータ型が不明であっても構いません。
変数の型は対応する列のデータ型に従って変更されます。
構文は以下のとおりです:
referencing_item referenced_item%TYPE;
参照項目は、参照される項目の以下の内容を継承します:
データ型とサイズ。
制約(列を参照する場合を除く)。
参照項目は、参照項目の初期値は継承しません。したがって、参照項目が NOT NULL 制約を指定または継承している場合は、初期値を指定する必要があります。
%TYPE は、データベース値を格納するための変数を宣言する際に特に適しています。列の型と同じ変数を宣言する構文は次のとおりです:
variable_name table_name.column_name%TYPE;
例:
obclient> DECLARE
firstname VARCHAR(30) NOT NULL := 'San';
lastname firstname%TYPE := 'Zhang';
BEGIN
DBMS_OUTPUT.PUT_LINE('firstname=' || firstname);
DBMS_OUTPUT.PUT_LINE('lastname=' || lastname);
END;
/
Query OK, 0 rows affected
firstname=San
lastname=Zhang
この例では、変数 lastname は変数 firstname のデータ型、サイズ、および NOT NULL 制約を継承しています。lastname は firstname の初期値を継承しないため、宣言時に初期値(30文字を超えてはならない)を指定する必要があります。