2016-05-09 10 views
0

からSQLを実行し、SQL-clauseが保存されました:のOracle SQLは、私は、テーブル内の列を持つvarchar型のフィールド

Table_A 
    ID | entry 
    -------------- 
    1 | "(select some_id FROM table_one)" -- This is stored a VARCHAR(4000) 
    2 | "(select some_id FROM table_one WHERE column_one like 'test')" 

はAでどことして記入欄では、このところのステートメントを使用することが可能です選択?以下のような

何か:

SELECT * 
    FROM table_B, table_A 
    WHERE table_B.id = table_A.id 
    AND table_B.value IN --and here should be the entry column from table_A 

答えて

3

あなたは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 
+0

機能を試してみましょう! – wasp256

関連する問題