【问题标题】:Dynamic Procedure Execution动态过程执行
【发布时间】:2015-10-13 11:46:30
【问题描述】:

您好,我必须执行远程调用...

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()
  • 还是不行。我收到同样的错误。
  • 使用'||DB_LINK()。它将 DB_LINK() 作为一个函数。并抛出未找到 DB_LINK() 函数。
  • 你的语法好像是正确的:stackoverflow.com/q/240788/272735你确定DB_LINK的值是正确的并且数据库链接有权限执行DBMS_STATS包吗?

标签: oracle plsql remote-access


【解决方案1】:

线索在于错误消息的准确措辞: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 没有参数,所以空括号是可选的。如果它们让你感觉更快乐,一定要包括它们。

【讨论】:

    【解决方案2】:
    EXECUTE IMMEDIATE 'DBMS_STATS.FLUSH_DATABASE_MONITORING_INFO@'||DB_LINK();
    

    如果 DB_LINK 是一个返回 VARCHAR2 字符串的全局函数,应该可以工作。

    【讨论】:

    • DB_LINK 似乎是一个变量。 () 属于对 FLUSH_DATABASE_MONITORING_INFO 的调用。
    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 1970-01-01
    • 2018-05-06
    • 2020-02-10
    • 2020-04-04
    • 2013-12-15
    • 2016-05-14
    • 2016-01-07
    相关资源
    最近更新 更多