あなたはdynamicly SQL内でSQLを追加することはできません。また
あなたは、文字列のコレクションを返し、SQLを受け付ける(以下SQLでは、my_function)関数を作成する必要があります関数内のクエリロジックをカプセル化を使用し、このためにDynamic SQL in PL/SQL.
を使用することができますパラメータとしての文とクエリをこのように書く
SELECT *
FROM table_B, table_A
WHERE table_B.id = table_A.id
AND table_B.value IN (select column_value from Table(MY_FUNCTION(Table_A.SQL_Statement))
パフォーマンスは、このアプローチを無視してはなりません。
さらに、SQLインジェクションが可能かどうかを分析し、悪意のあるSQLが関数にパラメータとして渡されていないことを確認する必要があります
サンプルコード
CREATE TYPE varchar_tab_t AS TABLE OF VARCHAR2(30);
/
CREATE OR REPLACE function MY_FUNCTION (sqlstring in varchar2) return varchar_tab_t IS
v_values_tab varchar_tab_t;
BEGIN
EXECUTE IMMEDIATE sqlstring bulk collect into v_values_tab;
return v_values_tab;
END MY_FUNCTION;
/
with table_a (id, SQL_STATEMENT) as
(select 1, 'Select 1 from dual union select 2 from dual union select 3 from dual' from dual)
, table_b (id, value) as
( select 1, 1 from dual
union all select 1, 2 from dual
union all select 1, 5 from dual -- this one should not be shown
)
SELECT *
FROM table_B, table_A
WHERE table_B.id = table_A.id
AND table_B.value IN (select column_value from Table(MY_FUNCTION(Table_A.SQL_Statement)))
結果
1 1 1 Select 1 from dual union select 2 from dual union select 3 from dual
1 2 1 Select 1 from dual union select 2 from dual union select 3 from dual
機能を試してみましょう! – wasp256