[英]Execute procedure dynamically from another procedure
内包装我有一个程序:
procedure testA
is
v1 varchar2(3200) = 'schema1.packB.test2('''||P1||''','''||P2||''',''Name1'',''Name2'',20,30)';
begin
EXECUTE IMMEDIATE v1;
end;
当我测试它时:
begin
packA.testA();
end;
我收到错误:“无效的SQL语句”
但是,当我从命令行执行v1时,如:
excecute schema1.packB.test2('ABC','DEF','Name1','Name2',20,30);
它正在工作。
我打印v1
以查看执行的内容,看起来与"schema1.packB.test2('ABC','DEF','Name1','Name2',20,30)"
完全相同"schema1.packB.test2('ABC','DEF','Name1','Name2',20,30)"
使用EXECUTE IMMEDIATE
运行存储过程时,需要包括BEGIN..END
。
v1 varchar2(3200) = 'BEGIN schema1.packB.test2('''||P1||''','''||P2||''',''Name1'',''Name2'',20,30) END;';
EXECUTE IMMEDIATE
运行SQL(DML / select)语句或PL / SQL匿名块
另外,请考虑直接使用BIND变量而不是PL / SQL变量。
'schema1.packB.test2( :p1, :p2, :p3, :p4 ,20,30)' USING P1,P2, 'Name1', 'Name2'
您需要一个块来使用execute immediate来调用过程。 例如:
SQL> create or replace package pck is
2 procedure proc;
3 end;
4 /
Package created.
SQL> create or replace package body pck is
2 procedure proc is
3 begin
4 null;
5 end;
6 end;
7 /
Package body created.
SQL> begin
2 execute immediate 'pck.proc;';
3 end;
4 /
begin
*
ERROR at line 1:
ORA-00900: invalid SQL statement
ORA-06512: at line 2
SQL> begin
2 execute immediate 'begin pck.proc; end;';
3 end;
4 /
PL/SQL procedure successfully completed.
此外,在使用execute immediate时,请考虑使用绑定变量传递参数。 例如,您可以(更好)重写以下内容
begin
execute immediate 'begin pck.proc(''x''); end;';
end;
如
begin
execute immediate 'begin pck.proc(:1); end;' using 'x';
end;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.