複数テーブルを参照する動的SQLでレコード変数を利用する方法
概要
複数テーブルを参照する動的SQLでは、
テーブル名%rowtype
のようにレコード変数を定義することができない。
また、定義済み固定カーソルのようにカーソル定義型による
カーソル名%rowtype
のようなレコード変数も定義できない
その為、複数テーブルを参照する動的SQLにてレコード変数を利用したい場合は
実行する動的SQLのSELECT 句項目に対応するユーザ定義レコード型を事前に定義し
その型をレコード変数として定義し利用する
手順
1.参照カーソルを定義する
2.rowtype の代わりとなるユーザ定義レコードを定義する
例)
-- 定義 -- 参照カーソル TYPE cv_type is ref cursor; -- カーソル変数定義 CUR_CV cv_type; -- ユーザ定義レコード TYPE rec_type is record( C_COL1 TABLE1.C_COL%type, S_COL2 TABLE2.S_COL%type, N_COL3 TABLE2.N_COL%type, S_COL4 varchar2(8), D_COL5 DATE ); -- レコード変数 ROW_REC rec_type; -- 動的SQL退避文字列変数 SQLSTR varchar2(256); -- 中略 -- 実行処理例 begin -- 動的SQL組立て SQLSTR := ''; SQLSTR := SQLSTR || 'select '; SQLSTR := SQLSTR || 'TABLE1.C_COL, TABLE2.S_COL,'; SQLSTR := SQLSTR || 'TABLE2.N_COL, ''12345678'', sysdate '; SQLSTR := SQLSTR || 'from '; SQLSTR := SQLSTR || 'TABLE1, TABLE2 '; SQLSTR := SQLSTR || 'where '; SQLSTR := SQLSTR || 'TABLE1.C_COL=TABLE2.C_COL '; -- カーソルオープン open CUR_CV for SQLSTR; -- Fetch ループ loop fetch CUR_CV into ROW_REC; exit when CUR_CV%notfound; -- 処理実行 PR_EXE(ROW_REC); end loop; -- カーソルクローズ close CUR_CV; end;