SQL*Loaderでシーケンスや、自作関数を利用する例  [Tips# 761]
CSVファイルなどのデータファイルを利用せず、ロードするデータを
ストアドファンクションで生成したり、オラクルのシーケンス
(SQL*loaderのシーケンスではありません)だけを利用して生成した
データをローディングする例です。
by discus     おすすめ度 (6)  ★★★★★★
■ 疑問、質問、感想は Oracle9iデータベースの部屋にご投稿ください
この例では、  hoge表の hoge_pk列にシーケンスhoge_seqから取得する
シーケンス値を、 hoge_timestamp列にget_systimestamp()ストアド
ファンクションにより取得される timestampを登録しています。

この機能をうまく使いこなせば、CSVファイルなどの固定データを
ローディングするだけでは得られない、複雑なデータを動的に生成して
ローディングすることができます。

参照「 Oracle9i ユーティリティガイド リリース2」

1. 準備

(1)systimestamp を返すファンクションを作ります。

※get_systimestamp.sqlの内容は以下の通り。
create or replace function get_systimestamp
return timestamp
is
begin
  return systimestamp;
end;
/
show error



SQL> conn hoge/hoge
接続されました。
SQL> @get_systimestamp

ファンクションが作成されました。

エラーはありません。



(2) シーケンスと表を作成します。

SQL>
SQL> create sequence hoge_seq minvalue 1 maxvalue 9999999999;

順序が作成されました。

SQL> create table hoge
  2  (
  3    hoge_pk number primary key,
  4    hoge_timestamp timestamp
  5  );

表が作成されました。


2. SQL*Loaderの制御ファイルを作成します。
   ここのポイントは、expression パラメータです。
   また、全データを生成するので、infile パラメータも
   指定しません。

   (1) hoge_pk には、 expressionパラメータで指定した
       シーケンスから連番をセットします。

   (2) hoge_timestampは、timestamp型なので、
       作成したファンクションを利用して、systimestampを
       セットします。SYSDATEなら、expressionパラメータを
       利用しなくても直接利用できますが、timestampを
       セットする場合には、ストアドファンクションでラップ
       し、それを expression パラメータで指定します。
                      expressionで呼び出す、ストアドファンクションを
       工夫することで、いろいろなデータを生成する
       ことができます。         

※制御ファイルの内容
load data
into table hoge replace
fields terminated by ',' optionally enclosed by '"'
(
  hoge_pk expression "hoge_seq.nextval",
  hoge_timestamp expression "get_systimestamp()"
)


3. ローディング
  ここでのポイントは、loadパラメータです。infileパラメータを利用しないので、
  loadパラメータでローディングするデータ件数を制御しています。

oracle@dynabook:〜>
oracle@dynabook:〜> sqlldr userid=hoge/hoge control=load_seq.ctl log=load.log
load=100

SQL*Loader: Release 9.2.0.5.0 - Production on 日 Feb 6 20:52:53 2005

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

コミット・ポイントに達しました。 - 論理レコード件数64
コミット・ポイントに達しました。 - 論理レコード件数100
oracle@dynabook:〜>
oracle@dynabook:〜> sqlplus /nolog

SQL> conn hoge/hoge
接続されました
SQL> select * from hoge;

   HOGE_PK HOGE_TIMESTAMP
---------- ------------------------------
         1 05-02-06 20:52:54.139495
         2 05-02-06 20:52:54.139880
         3 05-02-06 20:52:54.140039
         4 05-02-06 20:52:54.140191
         5 05-02-06 20:52:54.140337
         6 05-02-06 20:52:54.140484
         7 05-02-06 20:52:54.140631
         8 05-02-06 20:52:54.140778
         9 05-02-06 20:52:54.140924
        10 05-02-06 20:52:54.141070
        11 05-02-06 20:52:54.141216
        12 05-02-06 20:52:54.141361
        13 05-02-06 20:52:54.141509
  .
  .
  .
  88 05-02-06 20:52:54.371921
        89 05-02-06 20:52:54.372069
        90 05-02-06 20:52:54.372216
        91 05-02-06 20:52:54.372366
        92 05-02-06 20:52:54.372513
        93 05-02-06 20:52:54.372661
        94 05-02-06 20:52:54.372808
        95 05-02-06 20:52:54.372956
        96 05-02-06 20:52:54.373104
        97 05-02-06 20:52:54.373254
        98 05-02-06 20:52:54.373401
        99 05-02-06 20:52:54.373549
       100 05-02-06 20:52:54.373697

100行が選択されました。

SQL>

 
Copyright © 2003, Oracle Corporation Japan. All rights reserved.
Legal Notices and Terms of UsePrivacy Statement