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