Sql 如何使用列值作为选择表达式

Sql 如何使用列值作为选择表达式,sql,oracle,plsql,expression,Sql,Oracle,Plsql,Expression,有一个表包含一列,该列包含一个SQL select表达式。请参见以下示例: ╔════╦════════╦═══════════════════════════════════════════╗ ║ ID ║ Code ║ Expression ║ ║ 1 ║ B12321 ║ SELECT * FROM table WHERE code LIKE '%' ║ ║ 2 ║ A35525 ║ SELECT * FROM ta

有一个表包含一列,该列包含一个SQL select表达式。请参见以下示例:

╔════╦════════╦═══════════════════════════════════════════╗
║ ID ║ Code   ║ Expression                                ║
║ 1  ║ B12321 ║ SELECT * FROM table WHERE code LIKE '%'   ║
║ 2  ║ A35525 ║ SELECT * FROM table WHERE code = '1234'   ║
║ 3  ║ C23213 ║ SELECT * FROM table WHERE code <> '%D'    ║
╚════╩════════╩═══════════════════════════════════════════╝
╔════╦════════╦═══════════════════════════════════════════╗
║ 身份证件║ 代码║ 表情║
║ 1.║ B12321║ 从代码为“%”的表中选择*║
║ 2.║ A35525║ 从代码为“1234”的表中选择*║
║ 3.║ C23213║ 从代码为“%D”的表中选择*║
╚════╩════════╩═══════════════════════════════════════════╝
我想循环遍历表达式列,执行这些语句,并将结果插入另一个表中。这可能吗?我找不到与此相关的问题。除此之外,我还读到了一篇关于使用光标在表格中循环的文章,但其中有很多负面的地方


如果可能的话,你可以提供关于我的问题的有用链接,或者更好的是提供一个这样做的示例代码

是的,可以使用动态SQL,其中使用冒号限定摘录
code
:code,并使用双循环,如下所示:

SQL> desc tab2
Name       Type           
---------- -------------  
ID         VARCHAR2(20)                          
NAME       VARCHAR2(100) 

SQL> create table tab3( ID varchar2(20), name varchar2(50));

SQL> declare
    v_row       tab2%rowtype;   
    v_cursor    sys_refcursor;
begin
   for c in ( select ID, code, expression from tab1 ) 
   loop  
    open v_cursor for replace(c.expression,' code ',' :code ') using c.code;
    loop
        fetch v_cursor
         into  v_row;
       exit when v_cursor%notfound;
     insert into tab3 values( v_row.id,v_row.name );   
    end loop;  
    close v_cursor;
   end loop; 
end;   
/

其中
tab2
expression
列中的公共
表。

您需要动态SQL。由于您不想返回任何数据,因此可以通过一个小的PL/SQL过程:

create or replace procedure insert_by_code(in_code varchar2) as
begin
  for rec in (select expression from mytable where code = in_code) loop
    execute immediate 'insert into other_table ' || rec.expression;
    commit;
  end loop;
end insert_by_code;
或使用匿名块进行临时设置:

begin
  for rec in (select expression from mytable where code = :code) loop
    execute immediate 'insert into other_table ' || rec.expression;
    commit;
  end loop;
end;

动态sql
就是您要寻找的。。循环构造将是您的特权。。使用非游标循环或游标。您需要动态SQL。基本上,这意味着您运行一个查询,并使用其结果构建一个新的查询,然后运行该查询。您可以使用应用程序或网站中的任何编程语言来实现这一点。您还可以使用Oracle的编程语言PL/SQL。这在您的情况下相当容易,因为您不想返回任何数据,而只想将数据插入表中。