0

我的 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;

Thie procB 来自 UserB;

当我运行它时,我收到错误:

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

4

2 回答 2

1

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

授予用户 B 的权利:

grant execute on UserB.procB to userA;
于 2013-07-17T10:00:43.700 回答
0

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

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_v1或没有l_v2定义,所以我猜您只是错过了那部分代码。

于 2013-07-17T10:22:04.407 回答