Oracle EXECUTE IMMEDIATE错误

时间:2013-07-17 09:53:47

标签: oracle

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

2 个答案:

答案 0 :(得分:1)

用户A需要在userb.procB上执行EXECUTE。

授予用户B的权利:

grant execute on UserB.procB to userA;

答案 1 :(得分: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_v1l_v2,所以我猜您错过了部分代码。