web-dev-qa-db-ja.com

外部テーブルからの選択時のsqlplusエラー:ORA-29913:ODCIEXTTABLEOPENコールアウトの実行中にエラーが発生しました

私は簡単なOracle外部テーブルテストをセットアップしましたが、これは(DBAとUnix管理者と共に)機能しません。

以下は、Oracleの 外部テーブルの概念 に基づいています。私たちが使用しているデータベースは11gです。

これは外部テーブル定義です:

drop table emp_load;

CREATE TABLE emp_load
    (employee_number      CHAR(5),
     employee_dob         DATE,
     employee_last_name   CHAR(20),
     employee_first_name  CHAR(15),
     employee_middle_name CHAR(15),
     employee_hire_date   DATE)
  ORGANIZATION EXTERNAL
    (TYPE Oracle_LOADER
     DEFAULT DIRECTORY defaultdir
     ACCESS PARAMETERS
       (RECORDS DELIMITED BY NEWLINE
        FIELDS (employee_number      CHAR(2),
                employee_dob         CHAR(20),
                employee_last_name   CHAR(18),
                employee_first_name  CHAR(11),
                employee_middle_name CHAR(11),
                employee_hire_date   CHAR(10) date_format DATE mask "mm/dd/yyyy"
               )
       )
     LOCATION ('external_table_test.dat')
);

これは、「external_table_test.dat」の内容です。

56november, 15, 1980  baker             mary       alice      09/01/2004
87december, 20, 1970  roper             Lisa       marie      01/01/1999

「emp_load」を作成するスクリプトを問題なく実行できます。テーブルも細かく説明できます。 「select * from emp_load」を実行しようとすると、次のエラーが発生します。

SQL> select * from emp_load;
select * from emp_load
              *
ERROR at line 1:
ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error
error opening file /defaultdir/EMP_LOAD_29305.log

編集1
Oracleには、ディレクトリに対する読み取り/書き込み権限があります。

編集2
次の外部テーブル定義を使用して、このエラーを渡すことができました:

CREATE TABLE emp_load
    (employee_number      CHAR(3),
     employee_last_name   CHAR(20),
     employee_middle_name CHAR(15),
     employee_first_name  CHAR(15)
     )
  ORGANIZATION EXTERNAL
    (TYPE Oracle_LOADER
     DEFAULT DIRECTORY defaultdir
     ACCESS PARAMETERS
       (RECORDS DELIMITED BY NEWLINE
        BADFILE DHHSMAPSIS:'EMP.BAD'
        LOGFILE DHHSMAPSIS:'EMP.LOG'
        FIELDS TERMINATED BY ','
       )
    LOCATION ('external_table_test2.dat')
)
REJECT LIMIT UNLIMITED;

私の.datファイルは次のようになります...

056,baker,beth,mary
057,smith,teddy,john

「EMP.BAD」、「EMP.LOG」、「external_table_test2.dat」の権限を777に設定して機能させる必要がありました。 Oracleユーザーはこれらのファイルを所有していませんが、ファイルと同じグループに属しています。

これらのファイルのアクセス許可を770に設定すると、これが機能しない理由はありますか?繰り返しになりますが、Oracleはこれらのファイルと同じグループに属しているため、770で権限を許可すると思いました...

7
Zack Macomber

OracleのバージョンはRed Hat Enterprise Linuxで実行されています。いくつかの異なるタイプのグループ権限を試して、役に立たなかった。/defaultdirディレクトリには、Oracleユーザーのセカンダリグループであるグループがありました。/defaultdirディレクトリを更新して「oinstall」のグループ(Oracleのプライマリグループ)を作成したところ、そのディレクトリの下の外部テーブルから問題なく選択できました。

そのため、この問題が発生する可能性がある他のユーザーについては、ディレクトリにOracleのプライマリグループをグループとして設定します。これにより、私たちと同じように解決されます。ディレクトリとファイルのアクセス許可を770に設定し、外部テーブルの選択が正常に機能するようになりました。

4
Zack Macomber

Oracleにログインしているユーザーではなく、/ defaultdirディレクトリへの書き込み権限が必要なのは、Oracleデータベースを実行しているユーザーであることを覚えておいてください。通常、データベースはユーザー「Oracle」として実行しています。これは、外部テーブルを作成したユーザーと(必ずしも)同じではありません。

ディレクトリの権限も確認してください。

1
DCookie

私たちは同じ問題に直面しました:

ORA-29913: error in executing ODCIEXTTABLEOPEN callout
ORA-29400: data cartridge error error opening file /fs01/app/rms01/external/logs/SH_EXT_TAB_VGAG_DELIV_SCHED.log

私たちの場合、2つのノードを持つRACがありました。ログディレクトリに書き込み許可を与えた後、両側はすべて正常に動作しました。

1
Timo

Windows上のOracle RAC 11gでこのエラーが発生しました。解決策は、両方のノードで同じOSディレクトリツリーと外部ファイルを作成することでした。

0
Carlo