我很抱歉在互联网上发布了一个似乎已被多次询问的问题,但由于某种原因我无法完全解决它。
我试图使用 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_$LOADISTAT
、GV_$LOADPSTAT
和。我不太清楚为什么视图会损坏,但是重新编译它们会导致错误。查询本身使用的同义词已损坏,即、和同义词。V_$LOADISTAT
V_$LOADPSTAT
compiled with errors
gv$loadistat
gv$loadpstat
v$loadistat
v$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。有效!这不是一件好事,但它是一个仅用于测试目的的开发系统,所以,我不在乎。