sql >> データベース >  >> RDS >> Oracle

外部テーブルを使用してORA-29913を解決する方法

    ORA-29913 Oracleデータベースで外部テーブルを操作する際の一般的なエラーの1つです。エラーを生成するさまざまな方法と、エラーを解決するために何ができるかを検討します

    (1)外部ファイルが見つからないか、権限が正しくありません

    SQL> select * from Scott.example_external_table;
    select * from example_external_table
    *
    ERROR at line 1:
    ORA-29913: error in executing ODCIEXTTABLEOPEN callout
    ORA-29400: data cartridge error
    KUP-04040: file test1.dat in TEST_DIR not found
    ORA-06512: at "SYS.ORACLE_LOADER", line 14
    ORA-06512: at line 1

    テーブルを分析すると、同様のメッセージが表示されます:

    SQL> execute sys.dbms_stats.gather_table_stats(‘SCOTT’、’EXAMPLE_EXTERNAL_TABLE’);
    BEGIN sys.dbms_stats.gather_table_stats(‘SCOTT’、’EXAMPLE_EXTERNAL_TABLE’); END;
    *
    1行目のエラー:
    ORA-29913:ODCIEXTTABLEOPENコールアウトの実行中にエラーが発生しました
    ORA-29400:データカートリッジエラー
    KUP-04040:ファイルtest1 TEST_DIRの.datが見つかりません
    ORA-06512:「SYS.DBMS_STATS」の7161行目
    ORA-06512:「SYS.DBMS_STATS」の7174行目
    ORA-06512:行1

    または一般的に

    ORA-20011: Approximate NDV failed:

    ORA-29913: error in executing ODCIEXTTABLEOPEN callout
    ORA-29400: data cartridge error
    KUP-04040: file <file_name> in <directory_name> not found

    理由

    外部ファイルは正しい場所から移動されました

    SQL> select * from dba_directories ;

    OWNER DIRECTORY_NAME DIRECTORY_PATH
    ------ -------------- -----------------------
    SYS TEST_DIR /u01/oradata/external_files

    外部テーブルに関連付けられているファイル名を確認してください

    select * from dba_external_locations
    where table_name='EXAMPLE_EXTERNAL_TABLE';OWNER TABLE_NAME LOCATION DIRECTORY_OWNER DIRECTORY_NAME
    ----- ------------- -------- --------------- ---------------
    SYS EXAMPLE_EXTERNAL_TABLE test1.dat SYS TEST_DIR
    SYS EXAMPLE_EXTERNAL_TABLE test2.dat SYS TEST_DIR

    OSレベルでチェックしています
    $cd / u01 / oradata / external_files
    $ ls test [1-2] /dat
    そのようなファイルやディレクトリはありません

    そのため、ファイルが正しい場所に存在しません

    上記の両方のクエリは、以下のように組み合わせることができます

    select TABLE_NAME, DIRECTORY_PATH||'/'||LOCATION file_name from DBA_EXTERNAL_LOCATIONS loc, dba_directories dir
    where loc.DIRECTORY_OWNER=dir.OWNER
    and loc.DIRECTORY_NAME=dir.DIRECTORY_NAME
    and loc.OWNER='&1' and loc.TABLE_NAME='&2';

    解決策:
    両方のファイルを元の場所に戻します

    $ mv /u02/oradata/external_files/test2.dat /u01/oradata/external_files
    $ mv /u02/oradata/external_files/test1.dat / u01 / oradata / external_files

    これで
    以下のステートメントは両方とも成功します

    select * from Scott.example_external_table;
    execute sys.dbms_stats.gather_table_stats('SCOTT','EXAMPLE_EXTERNAL_TABLE');

    (2)外部ファイルのデータ形式が正しくありません

    1行目のエラー:
    ORA-29913:ODCIEXTTABLEFETCHコールアウトの実行中にエラーが発生しました
    ORA-30653:拒否制限に達しました
    ORA-06512:「SYS.ORACLE_LOADER」の14行目
    ORA-06512:1行目

    理由

    (i)外部ファイルに空の行が含まれている可能性があります
    (ii)TAB区切り文字またはHEX区切り文字を確認してください

    a。 Oracleで使用されるTAB区切り文字「\t」は、HEX値「09」で表されます。
    b。データファイルのHEX値は、
    CREATEステートメントで指定されたHEX値と一致する必要があります
    c。 CREATEステートメントのHEX仕様は、0X'gt;'または0x''のようになります。
    (iii)外部テーブルに追加された列の場合、同じものが外部ファイル

    解決策
    ログのエラーを確認し、それに応じて問題を修正してください

    (3)Null列のエラー

    1行目のエラー:
    ORA-29913:ODCIEXTTABLEOPENコールアウトの実行中にエラーが発生しました
    ORA-29400:データカートリッジエラー
    KUP-04043:テーブル列が外部ソースに見つかりません:

    理由
    外部ファイルには、元々数値列である最後の列のnull値があります。 nullを数値0に変更すると、クエリは成功します。

    解決策
    NULL値をロードするには、テーブル定義にENCLOSEDBY区切り文字を含める必要があります。

    改行で区切られたレコード
    フィールドは'で終了し、'
    オプションで''で囲まれます<<<=====
    フィールド値がありませんnullです

    (4) ORA-29913 Oracleがログファイルも作成できない場合にも発生する可能性があります。したがって、ディレクトリの権限を確認してください

    (5)外部テーブルディレクトリエラー
    ディレクトリへの読み取りおよび書き込み権限を付与しない場合、外部テーブルでもORA-29913エラーが発生する可能性があります。

    DIRECTORY extdir AS‘/ u01 / oradata / testdir’;
    GRANT READ ON DIRECTORY testdir TO ;
    GRANT WRITE ON DIRECTORY testdir TO ;

    外部テーブルに関するいくつかの良い情報があります。チェックアウトする必要があります

    Oracleの外部テーブルとは何ですか?

    (1)外部テーブルは、データベース外のフラットファイルにデータが保存されている読み取り専用テーブルです

    (2)外部テーブル機能を使用して、データベース内のテーブルであるかのように外部ファイルにアクセスできます。

    (3)外部テーブルを作成するときは、Oracleでその構造と場所を定義します。基本的には、メタデータをオラクル内に保存するだけです

    (4)テーブルを照会すると、Oracleは外部テーブルを読み取り、データがデータベースに格納されているかのように結果を返します。

    (5)Oracleサーバーは、フラットファイルを読み取るための2つの主要なOracleドライバーを提供します

    • Oracle_loader:これは、Oracleローダーテクノロジーを使用してフラットファイルを読み取るために使用されます。基本的に、SQLローダーテクノロジーを使用して解釈できるファイルを読み取ることができます
    • Oracle_datapump:これは、プラットフォームに依存しない形式を使用したデータのインポートとエクスポートの両方に使用されます

    関連記事
    Oracle外部テーブル:Oracleでの外部テーブルの使用法、外部テーブルの作成方法、使用方法については、この投稿を確認してください。
    Oracle Create table:テーブルはデータストレージの基本単位です。 Oracle Database.weでは、Oraclecreatetableコマンドを使用して外部キー/プライマリキーを使用してテーブルを作成する方法について説明しています。これを回避できます。このエラーに対するOracleのバグ
    ORA-01017:ユーザー名/パスワードが無効です。ログオンが拒否されました:ORA-01017の無効なユーザー名/パスワードの可能な解決策を確認してください。ログオンが拒否されました。 mucの努力なしでそれを迅速に解決する方法
    ORA-00001の一意性制約に違反しました:OracleエラーORA-00001の一意性制約に違反した場合の可能な解決策については、この投稿を確認してください。解決および修正方法
    ORA-00911:無効な文字:この投稿は、ORA-00911の一般的な原因に関するものです:ジョブを完了するのに役立つ例と解決策を含むOracleの無効な文字
    ORA-00900: ORA-00900の無効なSQLステートメントのさまざまな解決策に関するこの投稿。エラーの理由。デバッグして迅速に解決する方法、
    ORA-03113:通信チャネルのファイルの終わり:ORAを解決する方法を確認してください。 -03113:通信チャネルのファイルの終わり。このエラーは、プログラムの実行中のデータベースの起動時に発生する可能性があります
    Oracleドキュメント

    推奨コース

    OracleSQLの優れたUdemyコースは次のとおりです。
    Oracle-Sql-ステップバイステップ:このコースでは、基本的なSQL、結合、テーブルの作成とその構造の変更、ビューの作成、ユニオン、ユニオンなどすべてについて説明します。 。 SQL初心者のための素晴らしいコースと必須のコース
    完全なOracleSQL認定コース :これは、SQL開発者のスキルに対応できるようになりたい人にとっては良いコースです。わかりやすい説明コース
    OracleSQLDeveloper:Essentials、Tips and Tricks :OracleSql開発者ツールは多くの開発者によって使用されています。このコースでは、それを効果的に使用して生産的なSQL開発者になるための秘訣とレッスンを提供します。
    Oracle SQL Performance Tuning Masterclass 2020 :パフォーマンスの調整は、重要で最も求められているスキルの1つです。これは、それについて学び、SQLパフォーマンスの調整を開始するための良いコースです


    1. 疑問符を含むPostgreSQLJSON(B)演算子を使用するにはどうすればよいですか? JDBC経由

    2. トランザクションログ構成の問題

    3. SQLServerでテーブルを作成する方法

    4. MySQLでストアドプロシージャをスケジュールする方法