我正在尝试使用动态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
如果我用v_sql中的dbms_ouput替换上面的代码,程序就有效,所以在程序方面没问题,问题出在我试图动态调用的地方.
解决方法
不要使用字符串连接将参数传递给动态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;