指定したデータ型の値に格納領域を割り当て、参照しやすいように格納場所に名前を付けます。
オブジェクトを参照する前に、まず宣言しておく必要があります。宣言は、任意のブロック、サブプログラム、またはパッケージの宣言部に記述できます。
機能の適用範囲
この内容は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文字以下)を指定する必要があります。