【发布时间】:2014-12-19 13:56:43
【问题描述】:
我有以下 PL SQL 块:
WHENEVER SQLERROR EXIT 1
SET SERVEROUTPUT ON
DECLARE
v_sql VARCHAR2(500);
f1 VARCHAR2(20) := 'abc';
p_procname VARCHAR2 (30) := 'OPENLOG';
PROCEDURE OPENLOG (file_name IN VARCHAR2)
IS
BEGIN
NULL;
END;
BEGIN
DBMS_OUTPUT.PUT_LINE('Begin');
v_sql := 'BEGIN ' || p_procname || '(:a); END;';
EXECUTE IMMEDIATE v_sql USING IN f1;
END;
/
当我执行上面的块时,我得到了错误:
DECLARE
*
ERROR at line 1:
ORA-06550: line 1, column 7:
PLS-00201: identifier 'OPENLOG' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
ORA-06512: at line 19
但是,如果过程 OPENLOG 是包的一部分,那么它可以正常工作。
请告知如何使用动态 SQL 执行本地过程。
【问题讨论】:
-
是您的查询返回的整个过程的源代码,还是在您的匿名块中总是定义了几个过程并且查询只是告诉您要执行哪个?两者都有点奇怪,但可能有一种方法,具体取决于正在发生的事情。一个更完整的例子可能会有用。
-
所有过程都定义在匿名块中。查询只是告诉执行哪些。