Oracle 同义词错误

3

我刚开始使用Oracle数据库进行编程,遇到了以下错误:

ORA-06550: line 2, column 9: PL/SQL: ORA-01775: looping chain of synonyms 

这是我的代码还是数据库出了问题?整个数据访问层的代码都是一样的,但只有在尝试插入一个特定的表时才会出现此错误。

BEGIN
UPDATE DEAL_NOTE 
SET NOTE_TXT=:prmNOTE_TXT 
WHERE DEAL_ID=:prmDEAL_ID;

IF SQL%NOTFOUND THEN
INSERT INTO DEAL_NOTE (NOTE_TXT, DEAL_ID) values (:prmNOTE_TXT, :prmDEAL_ID);
END IF;

END;

这很可能是你的SQL语句中出现了错误。也许你可以编辑你的帖子,包含你的SQL语句。 - user153923
3个回答

3

你的数据库出现了问题。

ORA-01775错误表示你有一个同义词A引用了另一个同义词B,而同义词B又反向引用了同义词A。就像这样:

SQL> create synonym foo2 for foo1;

Synonym created.

SQL> create synonym foo1 for foo2;

Synonym created.

SQL> select * from foo2;
select * from foo2
              *
ERROR at line 1:
ORA-01775: looping chain of synonyms

唯一纠正此问题的方法是修复数据库中的同义词,以便您不会出现这种循环依赖。您可以运行查询来识别这些同义词循环(假设您只有一个一级循环,其中A指向B,B指向A,而不是更复杂的循环),查询如下:

SQL> ed
Wrote file afiedt.buf

  1  select a.synonym_name, b.synonym_name
  2    from all_synonyms a,
  3         all_synonyms b
  4   where a.owner = b.table_owner
  5     and a.synonym_name = b.table_name
  6     and b.owner = a.table_owner
  7*    and b.synonym_name = a.table_name
SQL> /

SYNONYM_NAME                   SYNONYM_NAME
------------------------------ ------------------------------
FOO2                           FOO1
FOO1                           FOO2

当我运行那个查询时,我没有得到任何结果,这是否意味着我有一个更大的问题? - esastincy
如果您创建一个引用自身的同义词,也会出现此错误。当您为特定模式的表/视图创建公共同义词,然后删除/重命名该表/视图时,很容易发生这种情况。 - DCookie
@Justin: 创建一个名为 me.x 的表。创建一个名为 x 的 PUBLIC SYNONYM,用于关联 me.x。删除表 me.x。执行 SELECT * FROM x; 会报错。其实你并不需要创建/删除表的步骤,因为这只是阐述我通常见到的情况。只需为 me.x 创建一个 PUBLIC SYNONYM x 即可。执行 SELECT * FROM x,仍然会报同样的错误。 - DCookie
在这种情况下,我会收到ORA-00942错误,而不是ORA-01775。 为scott.emp2创建公共同义词enp2_syn; 删除表emp2; 从emp2_syn中选择*; 第1行出现错误: ORA-00942:表或视图不存在。 - Justin Cave
@JustinCave 让我们在聊天室中继续这个讨论 - DCookie
显示剩余2条评论

0

这很可能是一个代码问题 - 可能与您脚本的第二行有关。

可以发帖吗?

从这篇文章如何调试ORA-01775:循环同义词链?

http://ora-01775.ora-code.com/建议:

ORA-01775:循环同义词链 原因:通过一系列CREATE同义词语句,定义了一个引用自身的同义词。例如,以下定义是循环的:

CREATE SYNONYM s1 for s2 CREATE SYNONYM s2 for s3 CREATE SYNONYM s3 for s1

操作:更改一个同义词定义,使其适用于基表或视图,并重试操作。


1
问题不太可能与脚本有关。第2行第9列无疑是同义词的引用位置。问题在于同义词的基本定义。 - Justin Cave

0

这是一个数据库问题 - 可能您正在操作的表是一个间接引用自身的同义词。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接