繁体   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