gpt4 book ai didi

oracle - 为什么我得到PLS-00302:组件存在时必须声明?

转载 作者:行者123 更新时间:2023-12-04 02:52:12 24 4
gpt4 key购买 nike

我正在使用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可以正常工作?

最佳答案

如果您有一个与架构同名的对象,则会出现该错误。例如:

create sequence s2;

begin
s2.a;
end;
/

ORA-06550: line 2, column 6:
PLS-00302: component 'A' must be declared
ORA-06550: line 2, column 3:
PL/SQL: Statement ignored


当您引用 S2.MY_FUNC2时,将解析对象名称,因此它不会尝试将S2评估为架构名称。当您仅将其称为 MY_FUNC2时,不会造成混淆,因此可以正常工作。

文档 explains name resolution。合格对象名称的第一部分-这里为S2-被评估为当前架构上的对象,然后才被评估为其他架构。

它可能不是序列;其他对象可能导致相同的错误。您可以通过查询数据字典来检查是否存在相同名称的对象。

select owner, object_type, object_name
from all_objects
where object_name = 'S2';

关于oracle - 为什么我得到PLS-00302:组件存在时必须声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28706077/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com