执行生成的sql语句(输出)

执行生成的sql语句(输出),sql,oracle,plsql,Sql,Oracle,Plsql,我想执行查询A,但我想使用查询B执行查询A。实现这一点的一种方法是将查询B的结果输出到sql文件并运行。我更愿意使用PL/SQL完成这项任务 --询问 --问题B 类似于 begin execute immediate 'delete from ta where id = ' || 4 ; end; / 或者,如果要使用某个过程: create or replace procedure delete_row ( row_ number ) as begin execute immed

我想执行查询A,但我想使用查询B执行查询A。实现这一点的一种方法是将查询B的结果输出到sql文件并运行。我更愿意使用PL/SQL完成这项任务

--询问

--问题B

类似于

begin
  execute immediate 'delete from ta where id = ' || 4 ; 
end;
/
或者,如果要使用某个过程:

create or replace procedure delete_row ( row_ number )
as
begin
  execute immediate 'delete from ta where id = ' || row_ ; 
end;
/

begin
  delete_row( 4 );
end;
/

Dbfiddle.

您可以尝试
循环
查询B的语句,并在末尾应用
执行immediate

SQL> set serveroutput on;
SQL> declare
  v_sql varchar2(4000);
begin

  for c in ( select 'delete from ' as test from dual
              union all
              select 'tableA ' as test from dual
              union all
              select 'where ' as test from dual
              union all
              select 'id=4' as test from dual )   
  loop
    v_sql := v_sql || c.test;
  end loop;            
    dbms_output.put_line(v_sql);
    execute immediate v_sql;
end;
/

为什么不手动构建字符串,然后使用动态SQL执行它?您的问题是什么?如何编写外部查询,使用查询B作为子查询,其结果将是与查询a语句相等的字符串?这很简单-使用
listag(test,chr(10))
-但诀窍是在查询B中对四个成员的
UNION ALL
中的行进行排序。需要帮助吗?这就是你提问的原因吗?
create or replace procedure delete_row ( row_ number )
as
begin
  execute immediate 'delete from ta where id = ' || row_ ; 
end;
/

begin
  delete_row( 4 );
end;
/
SQL> set serveroutput on;
SQL> declare
  v_sql varchar2(4000);
begin

  for c in ( select 'delete from ' as test from dual
              union all
              select 'tableA ' as test from dual
              union all
              select 'where ' as test from dual
              union all
              select 'id=4' as test from dual )   
  loop
    v_sql := v_sql || c.test;
  end loop;            
    dbms_output.put_line(v_sql);
    execute immediate v_sql;
end;
/