2015年9月6日日曜日

SQLローダでローダ実行日時をロードしたい

SQLローダで、ローダを実行した日時を同時にロードしたいという要件がありました。
その時、ちょっと躓いたのでメモします。
ちょっとしたお試しテーブルと、お試しコントロールファイルでやってます。

■コントロールファイル(test.ctl)
OPTIONS (
ROWS=1000,
DIRECT=TRUE,
MULTITHREADING=FALSE
)
LOAD DATA
APPEND
PRESERVE BLANKS
INTO TABLE A
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(
A,
B,
C CHAR "TO_CHAR(SYSDATE,'YYYYMMDD')",
D CHAR "TO_CHAR(SYSDATE,'HH24MISS')"
)

■コントロールファイル(test.dat)
"a","b"

■実行結果
[oracle@node1 ~]$ export ORACLE_SID=boo_1
[oracle@node1 ~]$ sqlplus system/system

SQL*Plus: Release 12.1.0.2.0 Production on 日 9月 6 11:17:25 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.



Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
に接続されました。
SQL> select name from v$database;

NAME
---------------------------
BOO

SQL> create table a
  2  (a char(1),b char(1),c char(8),d char(6));

表が作成されました。

SQL> select * from a;

レコードが選択されませんでした。

SQL> exit

[oracle@node1 ~]$ sqlldr userid=system/system control=test.ctl log=test.log errors=1 rows=1

SQL*Loader: Release 12.1.0.2.0 - Production on 日 9月 6 11:31:18 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

使用パス:      ダイレクト
セーブ・データ・ポイントに達しました。 - 論理レコード件数1

ロードは完了しました。 - 論理レコード件数1

表A:
  0行のロードに成功しました。

確認するログ・ファイル:
  test.log
ロードの詳細を参照してください。
[oracle@node1 ~]$ ls -ltr
合計 52
drwxr-xr-x. 2 oracle oinstall 4096  7月 26 11:09 2015 デスクトップ
drwxr-xr-x. 2 oracle oinstall 4096  7月 26 11:09 2015 公開
drwxr-xr-x. 2 oracle oinstall 4096  7月 26 11:09 2015 テンプレート
drwxr-xr-x. 2 oracle oinstall 4096  7月 26 11:09 2015 ダウンロード
drwxr-xr-x. 2 oracle oinstall 4096  7月 26 11:09 2015 音楽
drwxr-xr-x. 2 oracle oinstall 4096  7月 26 11:09 2015 画像
drwxr-xr-x. 2 oracle oinstall 4096  7月 26 11:09 2015 ビデオ
drwxr-xr-x. 2 oracle oinstall 4096  8月 10 16:01 2015 ドキュメント
drwxr-xr-x. 3 oracle oinstall 4096  8月 10 16:41 2015 tmp
-rw-r--r--. 1 oracle oinstall    8  9月  6 11:01 2015 test.dat
-rw-r--r--. 1 oracle oinstall  241  9月  6 11:26 2015 test.ctl
-rw-r--r--. 1 oracle oinstall    8  9月  6 11:31 2015 test.bad
-rw-r--r--. 1 oracle oinstall 2284  9月  6 11:31 2015 test.log
[oracle@node1 ~]$ cat test.log

SQL*Loader: Release 12.1.0.2.0 - Production on 日 9月 6 11:31:18 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

制御ファイル:    test.ctl
データファイルtest.dat
  不良ファイル:  test.bad
  廃棄ファイル:  指定なし

 (すべて廃棄できます)

ロード数: ALL
スキップ数: 0
許容エラー数: 1
継続文字:    指定なし
使用パス:      ダイレクト

表A、 ロード済 すべての論理レコードから
この表に対する有効な挿入オプション: APPEND

   列名                  位置   長さ  用語暗号化データ型
------------------------------ ---------- ----- ---- ---- ---------------------
A                                  FIRST    *  , O(")CHARACTER
B                                   NEXT    *  , O(")CHARACTER
C                                   NEXT    *  , O(")CHARACTER
    列のSQL文字列 : "TO_CHAR(SYSDATE,'YYYYMMDD')"
D                                   NEXT    *  , O(")CHARACTER
    列のSQL文字列 : "TO_CHAR(SYSDATE,'HH24MISS')"

レコード1: 拒否されました。- 表A,列Cでエラーが発生しました。
論理レコードが終了する前に列が見つかりませんでした。(TRAILING NULLCOLSを使用)

表A:
  0行のロードに成功しました。
  1行はデータ・エラーのためロードされませんでした。
  0行はWHEN句のエラーのためロードされませんでした。
  0行はすべてのフィールドがNULLのためロードされませんでした。
バインド配列サイズはダイレクト・パスで使用されません。
列配列の行数:        1
ストリーム・バッファのバイト数:   256000
読取りバッファのバイト数:  1048576

スキップされた論理レコードの合計:           0
読み込まれた論理レコードの合計:             1
拒否された論理レコードの合計:               1
廃棄された論理レコードの合計:        0
ダイレクト・パスのマルチスレッド最適化が使用禁止です

実行開始日 9月  06 11:31:18 2015
実行終了日 9月  06 11:31:41 2015

実行時間:        00: 00: 23.41
CPU時間 :        00: 00: 00.03

失敗した。。。


■考察
テーブル列と、datファイルの項目数が合っていないと、制御ファイル
にTO_CHAR(SYSDATE,'YYYYMMDD')としていしても、エラーになります。
どうやら、TRAILING NULLCOLSが無いと、C、D列に日、時間をロードすることが
出来ないようです。

■コントロールファイル(test.ctl)修正後
OPTIONS (
ROWS=1000,
DIRECT=TRUE,
MULTITHREADING=FALSE
)
LOAD DATA
APPEND
PRESERVE BLANKS
INTO TABLE A
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS
(
A,
B,
C CHAR "TO_CHAR(SYSDATE,'YYYYMMDD')",
D CHAR "TO_CHAR(SYSDATE,'HH24MISS')"

)

■実行結果
[oracle@node1 ~]$ sqlldr userid=system/system control=test.ctl log=test.log errors=1 rows=1

SQL*Loader: Release 12.1.0.2.0 - Production on 日 9月 6 11:34:49 2015

Copyright (c) 1982, 2014, Oracle and/or its affiliates.  All rights reserved.

使用パス:      ダイレクト
セーブ・データ・ポイントに達しました。 - 論理レコード件数1

ロードは完了しました。 - 論理レコード件数1

表A:
  1行のロードに成功しました。

確認するログ・ファイル:
  test.log
ロードの詳細を参照してください。
[oracle@node1 ~]$

[oracle@node1 ~]$ sqlplus system/system

SQL*Plus: Release 12.1.0.2.0 Production on 日 9月 6 11:35:07 2015

Copyright (c) 1982, 2014, Oracle.  All rights reserved.

最終正常ログイン時間: 日 9月  06 2015 11:34:49 +09:00


Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, Automatic Storage Management, OLAP,
Advanced Analytics and Real Application Testing options
に接続されました。
SQL> select * from a;

A   B   C                        D
--- --- ------------------------ ------------------
a   b   20150906                 113453

SQL>

うまくいった!


■まとめ
TRAILING NULLCOLSを追記しただけでうまくいきました。
制御ファイルに、TO_CHAR(SYSDATE,'YYYYMMDD')に書いているのだから、
 TRAILING NULLCOLSは、必要ないと思ったのですが、、、、
必要なようです。
ちなみに、CONSTANT 'XXXXX'の場合は、 TRAILING NULLCOLSは必要なかった
です。

0 件のコメント:

コメントを投稿