カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまにRuby on Railsなども。

Oracle 表関数(table関数)を使ってテーブルオブジェクトを作成する

実際のテーブルは存在しないけど、プログラム上で二次元配列構造を定義し、
それをテーブルのように扱うために表関数(table()関数)というものがある。
PL/SQLプログラム上で配列の配列を定義する場合にも使えるので、使用方法をまとめてみた。

今回は例として、IDと名前だけを持つ簡単な従業員テーブルの構造を二次元配列データ構造として定義した。
テーブルとして定義するならこんなかんじ。

CREATE TABLE EMP(
  EMPID   VARCHAR2(10);
  EMPANME VARCHAR2(10);
);

今回、これをPL/SQLパッケージで二次元配列として定義した。

まず、行のtypeを定義する。

create or replace type emp_rec is
object(empid varchar2(10), empname varchar2(10));

次に、そのtypeのtable型とみなしたtypeを定義する。

create or replace type emp is
table of emp_rec;

テスト用に3行のempデータを定義し、それをテーブル形式で返す関数を作成する。

  • package spec
create or replace package emp_pkg is
 function get_table return emp;
end;
  • package body
create or replace package body emp_pkg is
 function get_table return emp
 is
  e emp;
  er1 emp_rec;
  er2 emp_rec;
  er3 emp_rec;
 begin
  er1 := emp_rec('1001', 'Yamada');
  er2 := emp_rec('1002', 'Tanaka');
  er3 := emp_rec('1003', 'Suzuki');
  e := emp();
  e.extend(3);
  e(1) := er1;
  e(2) := er2;
  e(3) := er3;
  return e;
 end;
end;

これをtable関数を使うと、以下のようにselect文で検索できる。

select * from table(emp_pkg.get_table);

実行結果は以下。

EMPID EMPNAME
1001 Yamada
1002 Tanaka
1003 Suzuki

一時的なデータをViewで返したり、複雑なロジックでデータを抽出したりするときに便利。