コレクションと一口に言っても結合配列、ネストした表、可変サイズの配列(VARRAY)の3種類がある。

本項では結合配列について記載。


コレクション

結合配列って言うとわかりにくいけど、「ハッシュ」の事でキーと値がセットになった代物のようだ。

oracle_collection


構文

type テーブル型 is table of データ型 [ not null ]
    index by { binary_integer | pls_integer | 文字データ型 };


BINARY_INTEGERとPLS_INTEGERの違いは?

BINARY_INTEGERデータ型への変更

Oracle 10g リリース1(10.1)以降では、BINARY_INTEGERデータ型が変更され、PLS_INTEGERと同じになりました。そのため、これらのデータ型を同じように使用できます。

http://otndnld.oracle.co.jp/document/products/oracle10g/102/doc_cd/appdev.102/B19257-01/whatsnew.html#1131


使用例

declare
    type tbl is table of varchar2(10) index by binary_integer;
    col_tbl tbl;  ※"結合配列名 テーブル型名"をセット
begin
    col_tbl(1) := 'hoge';  ※索引1に'hoge'をセット
    col_tbl(2) := 'foo';
    col_tbl(3) := 'bar';

    dbms_output.put_line(col_tbl(1));   ※索引1の値を表示
    dbms_output.put_line(col_tbl(2));
    dbms_output.put_line(col_tbl(3));
end;
/

hoge
foo
bar

PL/SQLプロシージャが正常に完了しました。

コレクション・メソッドの利用

コレクション・メソッドにて、オブジェクトに対して操作する事ができる。

declare
    type tbl is table of varchar2(10) index by pls_integer;
    col_tbl tbl;
begin
    col_tbl(1) := 'hoge';
    col_tbl(2) := 'foo';
    col_tbl(3) := 'bar';

    dbms_output.put_line(col_tbl.count);  ※要素数を表示
    dbms_output.put_line(col_tbl.first);  ※最初の要素Noを表示
    dbms_output.put_line(col_tbl.last);    ※最後の要素Noを表示
end;
/

3
1
3

PL/SQLプロシージャが正常に完了しました。


結合配列

ハッシュの値部分を配列(カラムの集合体)として利用。

データ型を%rowtypeとしてカラムの属性情報をセット。

各カラムは"結合配列名.カラム名"として参照・操作可能となる。

declare
    type tbl is table of t_test%rowtype    ※テーブル名%rowtype
                          index by binary_integer;
    tbl_rec tbl;
    cursor c_test is select * from t_test;
    cnt number := 0;
begin
    for r in c_test loop
        cnt := cnt + 1;
        tbl_rec(cnt) := r;
        dbms_output.put_line(tbl_rec(cnt).id||' '||
                             tbl_rec(cnt).name);
    end loop;
end;
/

※idカラム、nameカラムが表示される
1 hoge
2 foo
3 bar
5 baz

PL/SQLプロシージャが正常に完了しました。


結合配列をパッケージとして利用

仕様部の作成

create or replace package pkg_arg
is
    type tbl is table of t_test%rowtype
                            index by binary_integer;
    tbl_rec tbl;
    procedure get_tbl(arg out nocopy tbl);   ※1
end;
/

※1: outモードで値を引き渡すget_tblプロシージャを作成。また、nocopyの指定により通常の値渡しではなく参照渡しとなる。


本体部の作成

create or replace package body pkg_arg
is
    procedure get_tbl(arg out nocopy tbl)
    is
        cnt number :=0;
        cursor c_test is select * from t_test;
    begin
        for r in c_test loop
            cnt := cnt + 1;
            tbl_rec(cnt) := r; ※結合配列にt_test表のデータを代入
        end loop;
        arg := tbl_rec;   ※OUTパラメータへの引き渡し
    end get_tbl;
end;
/

利用してみる

begin
    pkg_arg.get_tbl(pkg_arg.tbl_rec);    ※パッケージ名.結合配列を引数にセット
    for r in 1..pkg_arg.tbl_rec.count loop
        dbms_output.put_line(pkg_arg.tbl_rec(r).id||' '||
                             pkg_arg.tbl_rec(r).name);
    end loop;
end;
/

1 hoge
2 foo
3 bar
5 baz

PL/SQLプロシージャが正常に完了しました。