簡體   English   中英

從另一個過程動態執行過程

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM