【发布时间】:2015-04-26 16:23:21
【问题描述】:
我使用的是 Oracle 10.2。
我正在编写一些脚本以将一些 ORACLE 对象从一个 SCHEMA (S1) 移动到另一个 (S2)。 我正在创建具有 DBA 角色的函数。 移动时,我的一个功能变得无效,但我不明白为什么。 它的代码是这样的:
MY_FUNC
CREATE OR REPLACE FUNCTION S2."MY_FUNC" RETURN VARCHAR2 IS
something VARCHAR2;
othervar VARCHAR2 (50):= 'TEST';
BEGIN
something := S2.MY_FUNC2();
/*some code*/
return othervar;
END;
/
如果我在没有架构的情况下使用 MY_FUNC2,它可以工作:something := MY_FUNC2(); 而不是 something := S2.MY_FUNC2();
My_FUNC2
CREATE OR REPLACE FUNCTION S2."MY_FUNC2" RETURN VARCHAR2 IS
something BOOLEAN;
othervar VARCHAR2 (50) := 'TEST2';
BEGIN
/*some code*/
return othervar;
END;
/
MY_FUNC2 有这样的同义词:
CREATE OR REPLACE PUBLIC SYNONYM "MY_FUNC2" FOR "S2"."MY_FUNC2"
MY_FUNC 编译出错:
PLS-00302:必须声明组件“MY_FUNC2”
我不明白为什么会出现此错误,当我的函数位于其他模式 (S1) 中时,它们具有完全相同的结构并且创建的同义词完全相同(但指向 S1)和 MY_FUNC编译好。
我最初并没有创建这个函数和同义词。是不是我在 S2 中遗漏了一些权限,所以MY_FUNC 可以正常工作?
【问题讨论】:
-
你是从 s1 还是 s2 调用函数?
-
如果您从 s1 进行调用,您需要将 s2.MY_FUNC2 的执行权限授予 s1。
-
据我了解,这与调用无关,它甚至无法编译。所以只是为了确保,因为你的问题并不清楚。您是以 sys 还是 s2 身份登录的?您首先创建了 MY_FUNC2,然后创建了公共同义词,然后创建了 MY_FUNC?如果您是具有创建公共同义词特权的 SYS 或 S2 并按此顺序执行,则没有理由不编译(除了 my_func 声明了 varchar2; 没有精度)
-
@Aramillo 一切都在 S2 中,我使用 DBA 角色登录。 Alex 在下面描述了这个问题。