kenken0807_DBメモ

つば九郎が好きなDBAです。Oracle Standard Editionでの運用やツールとかとかの備忘録。特に記載がない場合はoracle11gR2です。時々MySQL

sqlloaderで既存のシーケンスのNEXTVALを使用する

sqlloaderで既存のシーケンスのNEXTVALを使用には
コントロールファイルの対象カラムにexpression句と対象のシーケンスを指定してあげる。
以下例ではtest_seqidカラムにSEQ_SEQTEST.NEXTVALの値を格納する。

  • コントロールファイルを作成
$ vim test.ctl
LOAD DATA
INFILE 'seqtest.csv'
BADFILE  'seqtest.csv.bad'
DISCARDFILE  'seqtest.csv.dsc'
INTO TABLE seqtest
APPEND
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
( test_seqid expression "SEQ_SEQTEST.NEXTVAL"
,txt
,dd "sysdate"
 )
$ vim seqtest.csv

"test1",sysdate
"test2",sysdate
"test3",sysdate
"test4",sysdate
"test5",sysdate
"test6",sysdate
"test7",sysdate
"test8",sysdate
"test9",sysdate
"test10",sysdate
・
・
・
  • 実行前
>select SEQUENCE_NAME,INCREMENT_BY,CACHE_SIZE,LAST_NUMBER from user_sequences where sequence_name ='SEQ_SEQTEST';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_SEQTEST                               1         20          21

>select max(TEST_SEQID),count(*) from seqtest;

MAX(TEST_SEQID)   COUNT(*)
--------------- ----------
             14         14
  • 実行後
$ sqlldr orauser/oracle control=test.ctl

コミット・ポイントに達しました。 - 論理レコード件数47

>select SEQUENCE_NAME,INCREMENT_BY,CACHE_SIZE,LAST_NUMBER from user_sequences where sequence_name ='SEQ_SEQTEST';

SEQUENCE_NAME                  INCREMENT_BY CACHE_SIZE LAST_NUMBER
------------------------------ ------------ ---------- -----------
SEQ_SEQTEST                               1         20          61
select max(TEST_SEQID),count(*) from seqtest;

MAX(TEST_SEQID)   COUNT(*)
--------------- ----------
             60         60

SEQ_SEQTESTLAST_NUMBERが増えていることがわかる。