【问题标题】:Execute procedure dynamically from another procedure从另一个过程动态执行过程
【发布时间】:2018-07-02 06:25:31
【问题描述】:

packA里面我有一个程序:

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)"一模一样

【问题讨论】:

  • 您所说的“包装”是指“包装”吗?如果是这样,'Execute procedure from pack' 是否意味着'Execute package procedure'?
  • 是的,包,是的,从包中执行过程

标签: oracle stored-procedures plsql oracle12c


【解决方案1】:

在使用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'

【讨论】:

  • 为什么不用'schema1.packB.test2( :p1, :p2, :p3, :p4 ,20,30)' USING P1,P2, 'Name1', 'Name2'
  • @WernfriedDomscheit:谢谢!那次我很着急。
【解决方案2】:

您需要一个块来使用立即执行来调用过程。 例如:

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.

此外,在使用立即执行时,请考虑使用绑定变量传递参数。例如,您可以(更好)重写以下内容

begin
    execute immediate 'begin pck.proc(''x''); end;';
end;   

作为

begin
    execute immediate 'begin pck.proc(:1); end;' using 'x';
end;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 2011-03-31
    • 2016-01-01
    • 2020-09-27
    • 2010-09-15
    相关资源
    最近更新 更多