2013-07-17 92 views
0

我的oracle中有UserA和UserB。Oracle EXECUTE IMMEDIATE错误

这从用户A的包:

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是来自用户B;

当我运行它,我得到的错误:

PLS-00201:IDENTIFIER 'UserB.procB' must be declared;

+0

这里是引用错误... – kpater87

回答

1

用户需要在userb.procB的EXECUTE权。

授予权作为用户B:

grant execute on UserB.procB to userA; 
+0

我使用这个:授予执行任何程序;谢谢! – suuuch

0

,除非它是作为一个参数提供时,过程名称需要字符串作为一个固定值内;你有它外面,所以它试图解释为一个变量名,它不存在:

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

但你不会需要它EXECUT动态反正,你可以只是做:

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,所以我猜你刚刚错过了那部分代码。

相关问题