宣言

宣言によって、指定されたデータ型の値の記憶域を割り当て、値を参照できるように格納場所に名前を付けます。

オブジェクトは、参照する前に宣言しておく必要があります。宣言は、任意のブロック、サブプログラムまたはパッケージの宣言部で使用できます。

ここでのトピック

変数と定数以外のオブジェクトの宣言の詳細は、「ブロック」declare_sectionの構文を参照してください。

NOT NULL制約

スカラー変数または定数(またはコンポジット変数または定数のスカラー・コンポーネント)には、NOT NULL制約を指定できます。

NOT NULL制約を指定すると、その項目にNULL値を代入できなくなります。この制約は、(データ型から)暗黙的に指定するか、または明示的に指定することができます。

NOT NULLを指定するスカラー変数の宣言では、暗黙的か明示的かに関係なく、初期値を変数に代入する必要があります(スカラー変数のデフォルトの初期値はNULLであるため)。

PL/SQLは長さが0(ゼロ)の文字値をすべてNULL値とみなします。これには文字関数やブール式によって戻された値が含まれます。

NULL値かどうかをテストするには、「IS [NOT] NULL演算子」を使用します。

例3-9 NOT NULL制約が指定された変数の宣言

この例では、変数acct_idNOT NULL制約を明示的に指定し、変数abおよびcにはデータ型から暗黙的に指定します。

DECLARE
  acct_id INTEGER(4) NOT NULL := 9999;
  a NATURALN                  := 9999;
  b POSITIVEN                 := 9999;
  c SIMPLE_INTEGER            := 9999;
BEGIN
  NULL;
END;
/

例3-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;
/

変数の宣言

変数の宣言では、変数の名前とデータ型を常に指定します。

ほとんどのデータ型の場合、変数を宣言するときに初期値を指定することもできます。

変数名は、有効なユーザー定義の識別子である必要があります。

データ型は、任意のPL/SQLデータ型を選択できます。PL/SQLデータ型にはSQLデータ型が含まれます。データ型は、スカラー(内部コンポーネントなし)またはコンポジット(内部コンポーネントあり)のいずれかです。

例3-11 スカラー変数の宣言

この例では、いくつかの変数をスカラー・データ型で宣言しています。

DECLARE
  part_number       NUMBER(6);
  part_name         VARCHAR2(20);
  in_stock          BOOLEAN;
  part_price        NUMBER(6,2);
  part_description  VARCHAR2(50);
BEGIN
  NULL;
END;
/

関連トピック

定数の宣言

定数は、変更されない値を保持します。

「変数の宣言」の内容は定数の宣言にも当てはまりますが、定数の宣言には必要なものがさらに2つ(キーワードCONSTANTと定数の初期値)あります。(定数の初期値は永続的な値になります。)

例3-12 定数の宣言

この例では、3つの定数をスカラー・データ型で宣言しています。

DECLARE
  credit_limit     CONSTANT REAL    := 5000.00;
  max_days_in_year CONSTANT INTEGER := 366;
  urban_legend     CONSTANT BOOLEAN := FALSE;
BEGIN
  NULL;
END;
/

関連トピック

変数および定数の初期値

変数宣言では、NOT NULL制約を指定しないかぎり、初期値はオプションです。定数の宣言では、初期値は必須です。

ブロックまたはサブプログラムに宣言が含まれている場合は、ブロックまたはサブプログラムに制御が渡されるたびに、変数または定数に初期値が代入されます。宣言がパッケージ仕様部にある場合は、(変数または定数がパブリックかプライベートかには関係なく)セッションごとに初期値が変数または定数に代入されます。

初期値を指定するには、代入演算子(:=)またはキーワードDEFAULTを使用し、その後に式を指定します。式には、事前に宣言済の定数と、事前に初期化済の変数を使用できます。

変数に初期値を指定しない場合は、他のコンテキストで使用する前に、値を代入します。

例3-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;
/

例3-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 NULL
  
  IF counter IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('counter is NULL.');
  END IF;
END;
/
 

結果:

counter is NULL.

関連トピック

%TYPE属性を使用した項目の宣言

%TYPE属性を使用すると、事前に宣言されている変数または列と同じデータ型のデータ項目を(データ型を知らなくても)宣言できます。参照先項目の宣言が変更されると、それに応じて参照元項目の宣言も変更されます。

次に宣言の構文を示します。

referencing_item referenced_item%TYPE;

参照元項目および参照先項目にすることができる項目の種類は、「%TYPE属性」を参照してください。

参照元項目は、参照先項目から次のものを継承します。

  • データ型およびサイズ

  • 制約(参照先項目が列である場合を除く)

参照元項目は、参照先項目の初期値は継承しません。そのため、参照元項目でNOT NULL制約が指定または継承される場合は、参照元項目の初期値を指定する必要があります。

%TYPE属性は、データベースの値を保持する変数を宣言する場合に特に便利です。列と同じ型の変数を宣言する構文は、次のようになります。

variable_name table_name.column_name%TYPE;

関連項目:

「%ROWTYPE属性を使用した項目の宣言」(この属性を使用すると、データベースの表またはビュー内の行の全体または一部を表すレコード変数を宣言できます)

例3-15 列と同じ型の変数の宣言

この例では、変数surnameは、NOT NULL制約が指定されている列employees.last_nameのデータ型とサイズを継承しています。surnameNOT NULL制約を継承しないため、その宣言に初期値は不要です。

DECLARE
  surname  employees.last_name%TYPE;
BEGIN
  DBMS_OUTPUT.PUT_LINE('surname=' || surname);
END;
/

結果:

surname=

例3-16 別の変数と同じ型の変数の宣言

この例では、変数surnameは変数nameのデータ型、サイズおよびNOT NULL制約を継承しています。surnamenameの初期値を継承しないため、その宣言には初期値(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