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