PL/SQLでジェネリックなリストを使う

PL/SQLにはTable型というものがあり、これは簡単にいうと「ジェネリック型のリスト」ののような感じです。


declare
type listClass is table of 社員%rowtype;
list listClass;
begin
select * bulk collect into list from 社員;
end;

このように使えるみたいです。次に、このリストを、戻り値として返す例です。


create package foo is
-- リスト型の定義
type listClass is table of 社員%rowtype;
-- リスト型を返す関数の定義
function bar return listClass;
end;

create or replace package body foo is

function bar return listClass is
-- リスト型オブジェクトを定義
list listClass;
begin
-- bulk collect into を使って代入
select * bulk collect into list from 社員;

return list;
end;

end;

見慣れない「bulk collect into 〜」を使う以外は、かなり直感的なプログラムだと思います。また、リストの要素型には以下のように、ユーザ定義型を指定することもできるようです。


create package foo is
-- リストの要素型の定義
type rowClass is record (id number, name varchar2(10));
-- リスト型の定義
type listClass is table of rowClass;

ここでは「record」型として、ユーザ定義の型を定義しています。
ちなみに、functionの呼び出し元では、以下のようになります。


declare
list foo.listClass;
begin
list := foo.bar();

-- 取得した内容を、デバッグ出力で確認
for i in 1 .. list.count loop
dbms_output.put_line(list(i).name);
end loop;
end;