3

我正在尝试使用动态 sql 来执行一个过程并检索输出参数:

v_sql := 'BEGIN ' || p_procname || '(''' || p_input1 || ''', ''' || p_input2 || ''', v_output1); END;';
DBMS_OUTPUT.PUT_LINE(v_sql);
EXECUTE IMMEDIATE v_sql;

v_output1声明了变量,但收到以下错误消息:

PLS-00201: identifier 'V_ISSUE' must be declared 

如果我用 dbms_ouput 替换上述代码,则该过程有效v_sql,因此在过程方面没问题,问题在于我尝试动态调用它的方式。

我不知道我正在尝试做的事情是否会以这种方式工作。有没有办法通过动态 SQL 从这个过程调用中检索输出参数?

4

2 回答 2

9

不要使用字符串连接将参数传递给动态 SQL。这完全被认为是一种不好的做法,不仅对 Oracle 而言。

这很糟糕,但主要的失败点是在动态 SQL 字符串中使用局部变量的名称,因为它在引入该变量的代码块之外的任何地方都不可见。

您的代码应如下所示:

declare 
  v_sql varchar2(4000);
  p_procname varchar2(100);
  p_input1 number;
  p_input2 number;
  v_output1 number;   
begin

  v_sql := 'begin ' || p_procname || '(:p_input1, :p_input2, :v_output); end;';

  execute immediate v_sql 
  using in p_input1, in p_input2, out v_output1;

end;
于 2013-04-23T21:00:29.510 回答
4

在这里找到我的答案。

v_sql := 'BEGIN ' || p_procname || '(:a, :b, :c); END;';

EXECUTE IMMEDIATE v_sql
USING IN p_input1, IN p_input2, OUT v_output1;
于 2013-04-23T20:54:28.117 回答