我的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';
答案 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_v1
或l_v2
,所以我猜您错过了部分代码。