当我使用sqlldr时,我得到一个ORA-01775:循环链的同义词错误

时间:2012-07-06 20:36:51

标签: oracle oracle11g

我为发布一个似乎在互联网上多次被问过的问题而道歉,但由于某些原因我无法解决这个问题。

我试图使用Oracle神奇的sqldr实用程序填充一些表,但由于某种原因它会抛出ORA-01775错误。

我到谷歌的每一个地方,人们都会说:“业余的,把你的同义词整理出来”(这是一种解释),这很好,但我没有做任何同义词。

此处,以下内容对我的系统无效:

SQLPLUS user/password
SQL>CREATE TABLE test (name varchar(10), id number);
SQL>exit

然后,我有一个.ctl文件,其中包含以下内容:

load data
    characterset utf16
    infile *
    append
    into table test
    (name,
     id
    )
    begindata
    "GURRR"  4567

然后我运行这个命令:

sqlldr user@localhost/password control=/tmp/controlfiles/test.ctl

结果:

SQL*Loader-702: Internal error - ulndotvcol: OCIStmtExecute()
ORA-01775: looping chain of synonyms

test.log的一部分:

Table TEST, loaded from every logical record.
Insert option in effect for this table: APPEND

Column Name                  Position   Len  Term Encl Datatype
------------------------------ ---------- ----- ---- ---- ---------------------
NAME                                FIRST     2           CHARACTER            
ID                                   NEXT     2           CHARACTER            

SQL*Loader-702: Internal error - ulndotvcol: OCIStmtExecute()
ORA-01775: looping chain of synonyms     

而且,如果我尝试手动插入:

SQL> insert into test values ('aa', 56);
1 row created.

没有问题。

所以,是的,我被卡住了!

如果有帮助,我在CentOS上使用Oracle 11g XE。

感谢帮助人员,我很感激。

编辑:

我有点想象出问题的一部分。问题是沿着这条线的某个地方,也许是在一次失败的负载或其他事情中,Oracle给自己提供了腐败的观点和同义词。

受影响的观看次数为:GV_$LOADISTATGV_$LOADPSTATV_$LOADISTATV_$LOADPSTAT。我不太确定为什么这些视图已损坏,但重新编译它们会导致compiled with errors错误。查询本身使用的同义词已损坏,即gv$loadistatgv$loadpstatv$loadistatv$loadpstat个同义词。

我不确定为什么会这样,我什么都不懂。所以,我决定删除同义词并重新创建它们。不幸的是,我无法重新创建它们,因为他们指出的观点(这里有一些奇怪的递归......)已经腐败了。这些观点是前面提到的GV_$LOADISTAT和其他观点。换句话说,同义词指向使用这些同义词的视图。谈论一个循环链。

所以...我重新创建了公共同义词,但我没有将视图指定为GV_$LOADISTAT,而是将其指定为sys.GV_$LOADISTAT。 e.g。

DROP PUBLIC synonym GV$LOADISTAT;
CREATE PUBLIC synonym GV$LOADISTAT for sys.GV_$LOADISTAT;

然后,我重新创建了用户视图以指向那些公共同义词。

CREATE OR REPLACE FORCE VIEW "USER"."GV_$LOADISTAT" ("INST_ID", "OWNER", "TABNAME", "INDEXNAME", "SUBNAME", "MESSAGE_NUM", "MESSAGE")
 AS
 SELECT "INST_ID",
   "OWNER",
   "TABNAME",
   "INDEXNAME",
   "SUBNAME",
   "MESSAGE_NUM",
   "MESSAGE"
 FROM gv$loadistat;

这似乎修复了观点/同义词。是的,它有点像黑客,但它有点工作。不幸的是,这还不足以运行SQL Loader。我收到table or view does not exist错误。

我尝试向我的普通用户授予更多权限,但它不起作用。所以,我放弃并运行SQL Loader作为sysdba。有效!这不是一件好事,但它是一个仅用于测试目的的开发系统,因此,我并不关心。

1 个答案:

答案 0 :(得分:1)

我无法重复你的循环同义词链错误,但似乎控制文件需要一些工作,至少对我的环境而言。

我能够通过修改它来让你的例子起作用:

load data
infile *
append
into table test
fields terminated by "," optionally enclosed by '"'
(name,
 id
)
begindata
"GURRR",4567