动态过程执行
Dynamic Procedure Execution
嗨,我必须执行远程调用...
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@DB_LINK()
... 来自存储过程。
因为DB_LINK的值是在运行时获取的。它应该动态执行。我尝试使用
EXECUTE IMMEDIATE ' DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK||'()';
但是我得到以下错误
ORA-00900: invalid SQL statement
谁能告诉我如何动态执行存储过程?
EXECUTE IMMEDIATE 'DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK();
如果 DB_LINK 是一个返回 VARCHAR2 字符串的全局函数,应该可以工作。
线索在于错误消息的准确措辞:invalid SQL statement
。由于 the PL/SQL manual says,EXECUTE IMMEDIATE 用于执行动态 SQL 语句。
您正在执行过程调用,即 PL/SQL 而不是 SQL。所以你需要传递一个匿名块到 EXECUTE IMMEDIATE:
EXECUTE IMMEDIATE
'begin DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK||'() ; end;'
;
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO 没有参数,所以空括号是可选的。如果它们让您感到更快乐,请务必包括它们。
嗨,我必须执行远程调用...
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@DB_LINK()
... 来自存储过程。
因为DB_LINK的值是在运行时获取的。它应该动态执行。我尝试使用
EXECUTE IMMEDIATE ' DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK||'()';
但是我得到以下错误
ORA-00900: invalid SQL statement
谁能告诉我如何动态执行存储过程?
EXECUTE IMMEDIATE 'DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK();
如果 DB_LINK 是一个返回 VARCHAR2 字符串的全局函数,应该可以工作。
线索在于错误消息的准确措辞:invalid SQL statement
。由于 the PL/SQL manual says,EXECUTE IMMEDIATE 用于执行动态 SQL 语句。
您正在执行过程调用,即 PL/SQL 而不是 SQL。所以你需要传递一个匿名块到 EXECUTE IMMEDIATE:
EXECUTE IMMEDIATE
'begin DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK||'() ; end;'
;
DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO 没有参数,所以空括号是可选的。如果它们让您感到更快乐,请务必包括它们。