Plsql-variable-types

提供:Dev Guides
移動先:案内検索

PL/SQL-変数

この章では、Pl/SQLの変数について説明します。 変数は、プログラムが操作できるストレージ領域に付けられた名前に他なりません。 PL/SQLの各変数には、変数のメモリーのサイズとレイアウトを決定する特定のデータ型があります。そのメモリ内に保存できる値の範囲と、変数に適用できる一連の操作。

PL/SQL変数の名前は、オプションでさらに文字、数字、ドル記号、アンダースコア、シャープ記号が続く文字で構成され、30文字を超えてはなりません。 デフォルトでは、変数名は大文字と小文字が区別されません。 予約されたPL/SQLキーワードを変数名として使用することはできません。

PL/SQLプログラミング言語では、日時データ型、レコード、コレクションなど、さまざまなタイプの変数を定義できます。 これについては、以降の章で説明します。 この章では、基本的な変数タイプのみを学習します。

PL/SQLでの変数宣言

PL/SQL変数は、宣言セクションまたはパッケージでグローバル変数として宣言する必要があります。 変数を宣言すると、PL/SQLは変数の値にメモリーを割り当て、ストレージの場所は変数名で識別されます。

変数を宣言するための構文は-

variable_name [CONSTANT] datatype [NOT NULL] [:= | DEFAULT initial_value]

ここで、_variable_name_はPL/SQLの有効な識別子であり、_datatype_は有効なPL/SQLデータ型、または前の章ですでに説明したユーザー定義のデータ型でなければなりません。 有効な変数宣言とその定義を以下に示します-

sales number(10, 2);
pi CONSTANT double precision := 3.1415;
name varchar2(25);
address varchar2(100);

データ型にサイズ、スケール、または精度の制限を指定すると、それは*制約付き宣言*と呼ばれます。 制約付き宣言は、制約なし宣言よりも少ないメモリで済みます。 たとえば-

sales number(10, 2);
name varchar2(25);
address varchar2(100);

PL/SQLでの変数の初期化

変数を宣言するたびに、PL/SQLはその変数にデフォルト値のNULLを割り当てます。 あなたがNULL値以外の値で変数を初期化する場合は、次のいずれかを使用して、宣言中に行うことができます-

  • DEFAULT キーワード
  • assignment 演算子

たとえば-

counter binary_integer := 0;
greetings varchar2(20) DEFAULT 'Have a Good Day';
*NOT NULL* 制約を使用して、変数が *NULL* 値を持たないように指定することもできます。 NOT NULL制約を使用する場合、その変数の初期値を明示的に割り当てる必要があります。

そうでない場合は、変数を適切に初期化することをお勧めします。プログラムによっては、予期しない結果が生じる場合があります。 さまざまなタイプの変数を利用する次の例を試してください-

DECLARE
   a integer := 10;
   b integer := 20;
   c integer;
   f real;
BEGIN
   c := a + b;
   dbms_output.put_line('Value of c: ' || c);
   f := 70.0/3.0;
   dbms_output.put_line('Value of f: ' || f);
END;
/

上記のコードが実行されると、次の結果が生成されます-

Value of c: 30
Value of f: 23.333333333333333333

PL/SQL procedure successfully completed.

PL/SQLの変数スコープ

PL/SQLでは、ブロックをネストできます。つまり、各プログラムブロックに別の内部ブロックを含めることができます。 変数が内部ブロック内で宣言されている場合、外部ブロックからはアクセスできません。 ただし、変数が宣言され、外部ブロックからアクセスできる場合、ネストされたすべての内部ブロックからもアクセスできます。 変数スコープには2種類あります-

  • ローカル変数-内部ブロックで宣言され、外部ブロックからアクセスできない変数。
  • グローバル変数-最も外側のブロックまたはパッケージで宣言された変数。

次の例は、単純な形式で Local および Global 変数の使用法を示しています-

DECLARE
   -- Global variables
   num1 number := 95;
   num2 number := 85;
BEGIN
   dbms_output.put_line('Outer Variable num1: ' || num1);
   dbms_output.put_line('Outer Variable num2: ' || num2);
   DECLARE
      -- Local variables
      num1 number := 195;
      num2 number := 185;
   BEGIN
      dbms_output.put_line('Inner Variable num1: ' || num1);
      dbms_output.put_line('Inner Variable num2: ' || num2);
   END;
END;
/

上記のコードが実行されると、次の結果が生成されます-

Outer Variable num1: 95
Outer Variable num2: 85
Inner Variable num1: 195
Inner Variable num2: 185

PL/SQL procedure successfully completed.

SQLクエリ結果のPL/SQL変数への割り当て

SQLの SELECT INTO ステートメントを使用して、値をPL/SQL変数に割り当てることができます。 * SELECTリスト*の各アイテムについて、* INTOリスト*に対応するタイプ互換の変数が必要です。 次の例は、概念を示しています。 CUSTOMERSという名前のテーブルを作成しましょう-

SQLステートメントについては、リンクを参照してください:/sql/index [SQLチュートリアル]

CREATE TABLE CUSTOMERS(
   ID   INT NOT NULL,
   NAME VARCHAR (20) NOT NULL,
   AGE INT NOT NULL,
   ADDRESS CHAR (25),
   SALARY   DECIMAL (18, 2),
   PRIMARY KEY (ID)
);

Table Created

テーブルにいくつかの値を挿入しましょう-

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 );

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY)
VALUES (6, 'Komal', 22, 'MP', 4500.00 );

次のプログラムは、SQLの* SELECT INTO句*を使用して、上記の表の値をPL/SQL変数に割り当てます-

DECLARE
   c_id customers.id%type := 1;
   c_name  customers.name%type;
   c_addr customers.address%type;
   c_sal  customers.salary%type;
BEGIN
   SELECT name, address, salary INTO c_name, c_addr, c_sal
   FROM customers
   WHERE id = c_id;
   dbms_output.put_line
   ('Customer ' ||c_name || ' from ' || c_addr || ' earns ' || c_sal);
END;
/

上記のコードが実行されると、次の結果が生成されます-

Customer Ramesh from Ahmedabad earns 2000

PL/SQL procedure completed successfully