2012-07-06 116 views
1

对于发布一个似乎在互联网上多次被问到的问题,我表示抱歉,但由于某种原因,我无法完全修复它。我得到一个ORA-01775:当我使用sqlldr时出现同义词错误循环链接错误

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

无论我到哪里去Google,人们都会说:“业余爱好者,把你的同义词整理出来”(这是解释),这很好,但我没有任何同义词。

这里,下面没有我的系统上运行:

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 [email protected]/password control=/tmp/controlfiles/test.ctl 

结果:

test.log中的
SQL*Loader-702: Internal error - ulndotvcol: OCIStmtExecute() 
ORA-01775: looping chain of synonyms 

部分:

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_$LOADISTAT,GV_$LOADPSTAT,V_$LOADISTATV_$LOADPSTAT。我不太确定为什么这些观点已经损坏,但是重新编译它们导致了compiled with errors错误。查询中使用的同义词本身已损坏,即gv$loadistat,gv$loadpstat,v$loadistatv$loadpstat的同义词。

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

所以...我重新创建公共同义词,但而不是指定的视图GV_$LOADISTAT,我指定他们为sys.GV_$LOADISTAT。例如

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

做任何同义词(也许公众)存在的数据库? – 2012-07-06 21:42:10

+0

我认为存在公共同义词,但没有特定的表格。 – zermy 2012-07-11 15:12:21

回答

1

我无法重复你的循环同义词链错误,但它看起来控制文件需要一点工作,至少在我的环境中。

我能得到你的例子通过如此修改它的工作:

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