1

我很抱歉在互联网上发布了一个似乎已被多次询问的问题,但由于某种原因我无法完全解决它。

我试图使用 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_$LOADPSTAT和。我不太清楚为什么视图会损坏,但是重新编译它们会导致错误。查询本身使用的同义词已损坏,即、和同义词。V_$LOADISTATV_$LOADPSTATcompiled with errorsgv$loadistatgv$loadpstatv$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错误。

我尝试向我的普通用户授予更多权限,但没有奏效。所以,我放弃并以 sysdba 身份运行 SQL Loader。有效!这不是一件好事,但它是一个仅用于测试目的的开发系统,所以,我不在乎。

4

1 回答 1

1

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

我能够通过这样修改你的例子来工作:

load data
infile *
append
into table test
fields terminated by "," optionally enclosed by '"'
(name,
 id
)
begindata
"GURRR",4567
于 2012-07-07T03:47:24.740 回答