インターネット上で何度も聞かれているような質問を投稿して申し訳ありませんが、何らかの理由で完全に解決できません。
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 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
エラーが発生しました。
通常のユーザーにさらに権限を付与しようとしましたが、うまくいきませんでした。というわけで、諦めてSQL Loaderをsysdbaとして走らせてみました。出来た!良いことではありませんが、テスト目的で作成された開発専用システムなので、気にしませんでした。