PL/SQL の配列 (結合配列による二次元配列) Oracle 9i

PL/SQL におけるコレクション型は一次元配列を取り扱うコンテナであるが、その要素はネイティブな型 (NUMBER や CHAR) だけに制限されることがない。Oracle 9i
これはコレクション型を入れることも可能であることを意味する。言い換えれば配列の配列、すなわち二次元配列ということになる。(Oracle 9i 以降)
Oracle 8i 以前においては レコード型 を配列の要素にすることで 二次元配列までなら vArray(i).item1, vArray(i).item2 のような手段(vArray(i)(j) のようなアクセスはできない)で擬似的に配列のように使用することはできるが…あまり役に立たないだろう。

結合配列 を配列の要素にすると、その結合配列の要素数は連続(密)でなくても良いし、そのサイズも制限されない(※)。結合配列の二次元配列は要素を表のセルとしてを眺めると四角形でないということになる。結合配列の結合配列は、まるで虫食い算やクロスワードパズルのような状態であると思えば分かりやすいと思う。これは未使用のセルはメモリを確保する必要がないのでメモリの無駄遣いも少ない。
項目数を固定した VARRY(可変長配列)を使用すると下図の左のような密で連続した構造の二次元配列も作成できる。

(※) 数値の添え字として PLS_INTEGER 型の大きさには制限される。

イメージ図(縦軸が一次元、横軸が二次元にした表とみなした場合)

様々な二次元配列のメモリイメージ

n 次元配列(多次元配列)の場合も同様に配列をネストすることで作成が可能になる。

二次元配列の例

九九の計算テーブルの作成例
結合配列で作成しており、要素は「論理的」には 9×9 の密な状態になっている。

CREATE OR REPLACE PROCEDURE RIVUS.INITIAL_9x9
IS
	TYPE tElement IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
	TYPE tSquare IS TABLE OF tElement INDEX BY BINARY_INTEGER;
 
	vSquare	tSquare;
 
	PROCEDURE INITIALIZE( P_ARRAY OUT tSquare)
        IS
	BEGIN
		FOR i in 1 .. 9 LOOP
			FOR j in 1..9 LOOP
				P_ARRAY(i)(j) := i * j;
			END LOOP;
		END LOOP;
 
	END;
BEGIN
	INITIALIZE(vSquare);
 
	DBMS_OUTPUT.PUT_LINE('3×7=' || vSquare(3)(7));
END;
/
-- 実行例
SQL> call initial_9x9();
3×7=21
 
コールが完了しました。


関連事項

日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)