Oracle sql从varchar字段执行sql

时间:2016-05-09 09:18:01

标签: sql oracle

我在表中有一个列存储了sql-where子句:

  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')"

是否可以在entry列中将where语句用作select?

中的where

类似的东西:

   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

1 个答案:

答案 0 :(得分:3)

您无法在SQL中动态添加SQL。

或者您可以使用在函数中封装查询逻辑并使用{​​{3}}

为此你需要创建一个函数(下面的SQL中的my_function),它返回一个字符串集合并接受一个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 Injection ,并确保没有恶意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