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

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

確認環境
・Oracle Express Edition 11g Release 2

目次

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

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

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

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

  COLOR1 AR1 := AR1('赤','黄','青');
  --COLOR1 AR1 := AR1('赤','黄','青','緑'); エラー

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)); -- 赤
    DBMS_OUTPUT.PUT_LINE(COLOR1(2)); -- 黄
    DBMS_OUTPUT.PUT_LINE(COLOR1(3)); -- 青
END;

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

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

>execute test1
赤
黄
青
赤
黄
青

配列の要素数の指定が不要+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) := '赤'; --COLOR1(10)等任意の数値を指定可能
	COLOR1(1) := '黄'; --COLOR1(20)等任意の数値を指定可能
	COLOR1(2) := '青'; --COLOR1(30)等任意の数値を指定可能

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

	DBMS_OUTPUT.PUT_LINE(COLOR1(0));
	DBMS_OUTPUT.PUT_LINE(COLOR1(1));
	DBMS_OUTPUT.PUT_LINE(COLOR1(2));
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') := '赤';
	COLOR1('b') := '黄';
	COLOR1('c') := '青';

	DBMS_OUTPUT.PUT_LINE(COLOR1('a')); --赤
	DBMS_OUTPUT.PUT_LINE(COLOR1('b')); --黄
	DBMS_OUTPUT.PUT_LINE(COLOR1('c')); --青
END;

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

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

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

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

  COLOR1 AR1 := AR1();
  --COLOR1 AR1 := AR1('赤','黄','青');

BEGIN
    COLOR1.EXTEND (3);
    -- COLOR1(0) := '赤'; エラー
    COLOR1(1) := '赤';
    COLOR1(2) := '黄';
    COLOR1(3) := '青';

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

    -- 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のパッケージのサンプル

△上に戻る