1

インターネット上で何度も聞かれているような質問を投稿して申し訳ありませんが、何らかの理由で完全に解決できません。

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_$LOADPSTATV_$LOADISTATおよびV_$LOADPSTATです。ビューが破損した理由はよくわかりませんが、ビューを再コンパイルするとcompiled with errorsエラーが発生しました。クエリ自体で使用されている同義語、つまり、、、および同義語が破損していgv$loadistatました。gv$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エラーが発生しました。

通常のユーザーにさらに権限を付与しようとしましたが、うまくいきませんでした。というわけで、諦めてSQL Loaderをsysdbaとして走らせてみました。出来た!良いことではありませんが、テスト目的で作成された開発専用システムなので、気にしませんでした。

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 に答える