执行生成的sql语句(输出)
我想执行查询A,但我想使用查询B执行查询A。实现这一点的一种方法是将查询B的结果输出到sql文件并运行。我更愿意使用PL/SQL完成这项任务 --询问 --问题B 类似于执行生成的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
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;
/