[英]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.