1

外部テーブルで FIXED パラメータを使用すると、「ファイルの末尾にある部分レコード」エラーが発生します。

SQL Developer、Oracle 11g XE を使用しています。

-------
foo.dat - Field lengths: fname=7;lname=8;year=4
-------
Alvin  Tolliver1976
KennethBaer    1963
Mary   Dube    1973 

テーブルの DDL は次のとおりです。

CREATE TABLE emp_load (
    first_name CHAR(7)
    , last_name CHAR(8)
    , year_of_birth CHAR(4)
)
  ORGANIZATION EXTERNAL (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY ext_tab_dir
     ACCESS PARAMETERS (
           RECORDS FIXED 20 FIELDS (
               first_name CHAR(7)
               , last_name CHAR(8)
               ,  year_of_birth CHAR(4)
               )
      )
      LOCATION ('foo.dat'));

テーブル emp_load は作成されていますが、select ステートメントは次のエラー メッセージで失敗します。実行時のエラー メッセージselect * from emp_load:

ORA-29913: error in executing ODCIEXTTABLEFETCH callout
ORA-29400: data cartridge error
KUP-04018: <b>partial record at end of file C:\oracle\foo.dat</b>
29913. 00000 -  "error in executing %s callout"
*Cause:    The execution of the specified callout caused an error.
*Action:   Examine the error messages take appropriate action.

それが機能したのは、foo.dat を 1 行 (以下のように) 作成し、FIXED の長さを 19- に変更したときだけです。

Alvin  Tolliver1976KennethBaer    1963Mary   Dube    1973

これは、改行文字に関して何か間違っていることを示しているようですが、何がわかりません。

どんな助けでも大歓迎です。前もって感謝します!

4

2 に答える 2

0

複数行のデータファイルの最後の行の後に改行文字がありません。つまり、最後の行の長さは20バイトではなく19バイトです。データファイルのサイズを確認できます。3*20=60バイトである必要があります。

データファイルを変更してすべてのデータを1行にまとめ、すべてを使用RECORDS FIXED 19すると、改行が予期されないため、すべてが正常に機能します。

于 2011-10-17T06:10:33.900 に答える
0

私は答えを見つけた..

ドキュメントによると、FIXED は最後に改行文字を想定しています。

Windows では、改行 (\r\n) は 2 バイトを占めます。
したがって、Windows では、FIXED に渡す長さは = フィールドの全長 + 2
である必要があり、Unix では、= フィールドの全長 + 1 である必要があります。

Windows Vista マシンに Oracle 11g をインストールしました。したがって、全長は 20 ではなく 21 です。

ドキュメントの例は、おそらく改行 (\n) に 1 バイトを使用する Unix 用でした。

Oracle 11g が Windows にインストールされている場合、これは正しいコードです。

CREATE TABLE emp_load (名字CHAR(15)、姓字CHAR(20)、生年月日CHAR(4))
  ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY filesdir
                         アクセス パラメータ (レコード固定 21 フィールド
                                              (first_name CHAR(7),
                                               last_name CHAR(8),
                                               生年月日 CHAR(4)))
                         ロケーション ('info1.dat'));

代替ソリューションを提供してくれた ypercube に感謝します。私はあなたの提案に賛成しました。(DELIMITED BY NEWLINEを使用するというypercubeの提案は、実際にはより簡単な解決策である代替手段を提供しました。しかし、FIXEDのOracleドキュメントの例を使用しようとしている人にとって役立つと思うので、上記を投稿したかったのです。)

于 2011-10-17T22:06:09.017 に答える