【问题标题】:Oracle EXECUTE IMMEDIATE errorOracle EXECUTE IMMEDIATE 错误
【发布时间】:2013-07-17 18:22:04
【问题描述】:

我的oracle中有UserA和UserB。

这是来自 UserA 的包:

CREATE OR REPLACE PACKAGE BODY pkgA AS
    PROCEDURE procA 
    AS 
      l_sql = 'BEGIN ' || UserB.procB || (:l_v1,:l_v2) END;';
      EXECUTE IMMEDIATE l_sql USING IN l_v1,IN l_v2;
    END;

这个procB来自UserB;

当我运行它时,我得到了错误:

PLS-00201:IDENTIFIER 'UserB.procB' 必须声明;

【问题讨论】:

  • 这里的引号有问题...

标签: oracle


【解决方案1】:

用户 A 需要 userb.procB 上的 EXECUTE 权限。

授予用户 B 的权限:

grant execute on UserB.procB to userA;

【讨论】:

  • 我用这个:授权执行任何程序;谢谢!
【解决方案2】:

除非它作为参数提供,否则过程名称需要在字符串中作为固定值;你把它放在外面,所以它试图被解释为一个不存在的变量名:

l_sql = 'BEGIN UserB.procB(:l_v1,:l_v2) END;';

但是你无论如何都不需要动态执行它,你可以这样做:

PROCEDURE ProcA AS
BEGIN
  UserB.procB(l_v1, l_v2);
END;

如果你将过程作为变量传递,这会有点奇怪,你会得到类似的东西:

PROCEDURE procA (proc_name in varchar2) AS 
BEGIN
  l_sql = 'BEGIN ' || proc_name || '(:l_v1,:l_v2) END;';
  EXECUTE IMMEDIATE l_sql USING IN l_v1,IN l_v2;
END;

... 你可以称之为procA('UserB.procB')。我不认为这就是你想要做的,但这并不完全清楚。

在这两种情况下,您似乎都没有定义 l_v1l_v2,所以我猜您只是漏掉了那部分代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 2011-06-10
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 2011-02-16
    • 2021-11-27
    相关资源
    最近更新 更多