Oracle PL/SQLの配列のサンプル

OracleのPL/SQLの配列のサンプルです。

目次

配列の種類 配列の要素数の指定が必要(VARRAY)
  配列の要素数の指定が不要+INDEX BYが必要(連想配列)
  配列の要素数の指定が不要+INDEX BYも不要(ネストした表)

配列の要素数の指定が必要(VARRAY)

配列です。配列の要素数(VARRAY)を指定する必要があるためほぼ使用されません。

CREATE OR REPLACE PROCEDURE TEST1
IS
  TYPE AR1 IS VARRAY(3) OF VARCHAR2(10);

  COLOR1 AR1 := AR1('red','yellow','blue');
  --COLOR1 AR1 := AR1('red','yellow','blue','green'); エラー

BEGIN
--	FOR i IN 1..COLOR1.COUNT LOOP
	FOR i IN COLOR1.first..COLOR1.last LOOP
    	DBMS_OUTPUT.PUT_LINE(COLOR1(i)); -- 3回出力される
	END LOOP;

	--DBMS_OUTPUT.PUT_LINE(COLOR1(0)); -- エラー
    DBMS_OUTPUT.PUT_LINE(COLOR1(1)); -- red
    DBMS_OUTPUT.PUT_LINE(COLOR1(2)); -- yellow
    DBMS_OUTPUT.PUT_LINE(COLOR1(3)); -- blue
END;

3行目は、配列を宣言しています。要素数は3でVARCHAR2型とサイズ10を指定しています。
5行目は、変数COLOR1はAR1型であると宣言しています。また初期値として値を3つセットしています。
6行目は、値を4つセットした場合です。実行すると「サブスクリプトが有効範囲外です。」のエラーが発生します。
10行目は、配列の要素の数分ループ処理を行います。
9行目のやり方でも可能です。
14行目は、添字に0を指定していますがエラーになります。
添字は1から始まります。

実行結果は以下の通りです。

>execute test1
red
yellow
blue
red
yellow
blue

 

配列の要素数の指定が不要+INDEX BYが必要(連想配列)

配列の要素数(VARRAY)を指定する必要はありません。
連想配列(旧称はPL/SQL表または索引付き表)と呼ばれます。
添字は数値または文字列が使用可能です。INDEX BYにINTEGERまたはVARCHARを指定します。
よく使用されます。

CREATE OR REPLACE PROCEDURE TEST1
IS
  TYPE AR1  IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;

  COLOR1 AR1;

BEGIN
	COLOR1(0) := 'red'; --COLOR1(11)等任意の数値を指定可能
	COLOR1(1) := 'yellow'; --COLOR1(12)等任意の数値を指定可能
	COLOR1(2) := 'blue'; --COLOR1(13)等任意の数値を指定可能

--	FOR i IN 0..COLOR1.COUNT -1 LOOP
	FOR i IN COLOR1.first..COLOR1.last LOOP
    	DBMS_OUTPUT.PUT_LINE(COLOR1(i)); --red yellow blueが出力される
	END LOOP;
END;

3行目は、配列を宣言しています。VARCHAR2型とサイズ10を指定しています。要素数の指定はありません。INDEX BYがついています。
5行目は、変数COLOR1はAR1型であると宣言しています。
8から10行目は、値をセットしています。添字は任意の数値を指定できます。
13行目は、配列の要素の数分ループ処理を行います。ただし添字の数値が連続していないとエラーになります。
12行目のやり方でも可能です。0から始まり配列の要素数から1引いています。

 

配列の添字が文字列の場合

以下は、添字が文字列の場合です。

CREATE OR REPLACE PROCEDURE TEST1
IS
  TYPE AR1  IS TABLE OF VARCHAR2(10) INDEX BY VARCHAR2(1);

  COLOR1 AR1;

BEGIN
	COLOR1('a') := 'red';
	COLOR1('b') := 'yellow';
	COLOR1('c') := 'blue';

	DBMS_OUTPUT.PUT_LINE(COLOR1('a')); --red
	DBMS_OUTPUT.PUT_LINE(COLOR1('b')); --yellow
	DBMS_OUTPUT.PUT_LINE(COLOR1('c')); --blue
END;

2行目は、INDEX BYのあとはVARCHAR2です。
8~10行目は、添字に英字を指定しています。

 

添字を指定せず値をセットした場合

BINARY_INTEGERで添字を指定せず値をセットした場合は、1から始まります。

CREATE OR REPLACE PROCEDURE TEST1
IS
    TYPE type_employee_arr IS TABLE OF employee%ROWTYPE INDEX BY BINARY_INTEGER;
	employee_arr type_employee_arr;
BEGIN
	SELECT * BULK COLLECT INTO employee_arr FROM employee;

--	FOR i IN 0..COLOR1.COUNT -1 LOOP
	FOR i IN employee_arr.first..employee_arr.last LOOP
    	DBMS_OUTPUT.PUT_LINE(i); --1 2 3が出力される
		DBMS_OUTPUT.PUT_LINE(employee_arr(i).name);
	END LOOP;
END;

6行目は、BULK COLLECTで値を変数にセットしています。
10行目の変数iは1から始まります。

 

配列の要素数の指定が不要+INDEX BYも不要(ネストした表)

配列の要素数(VARRAY)とINDEX BYの指定が必要ありません。
ネストした表と呼ばれます。インデックスは整数のみです。

CREATE OR REPLACE PROCEDURE TEST1
IS
  TYPE AR1  IS TABLE OF VARCHAR2(10) ;

  COLOR1 AR1 := AR1();
  --COLOR1 AR1 := AR1('red','yellow','blue');

BEGIN
    COLOR1.EXTEND (3);
    -- COLOR1(0) := 'red'; エラー
    COLOR1(1) := 'red';
    COLOR1(2) := 'yellow';
    COLOR1(3) := 'blue';

    COLOR1.EXTEND;
    COLOR1(4) := 'green';

    -- FOR i IN 1..COLOR1.COUNT LOOP
    FOR i IN COLOR1.first..COLOR1.last LOOP
    	DBMS_OUTPUT.PUT_LINE(COLOR1(i));
	END LOOP;
END;

3行目は、配列を宣言しています。VARCHAR2型とサイズ10を指定しています。要素数とINDEX BYの指定はありません。
5行目は、変数COLOR1はAR1型であると宣言し初期化しています。
6行目のやり方でも可能です。初期値として値を3つセットしています。
9行目のEXTENDは伸びるという意味です。要素を追加します。
19行目は、配列の要素の数分ループ処理を行います。
18行目のやり方でも可能です。

リンク

以下は、Oracleのコレクションのリンクです。
https://docs.oracle.com/cd/E16338_01/appdev.112/b56260/composites.htm#CHDEIDIC

関連の記事

Oracle PL/SQLのストアドプロシージャのサンプル
Oracle PL/SQLのストアドファンクションのサンプル
Oracle PL/SQLのパッケージのサンプル

△上に戻る