複数テーブルを参照する動的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;