3

SQL * Loader制御ファイル内から入力データファイル名にアクセスして、入力ファイルのデータと一緒にテーブルに挿入するにはどうすればよいですか?

たとえば、次の制御ファイルがあるとします。

LOAD DATA

APPEND
INTO TABLE STG_AM02_BA_RAW
WHEN (1:2) = 'DT'
(
        SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
        ACCOUNT_NO                      POSITION(19:32)CHAR, 
        SUBSCRIBER_NAME                 POSITION(33:92)CHAR
)

私は次のようなことをしたい:

LOAD DATA

APPEND
INTO TABLE STG_AM02_BA_RAW
WHEN (1:2) = 'DT'
(
        SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
        ACCOUNT_NO                      POSITION(19:32)CHAR, 
        SUBSCRIBER_NAME                 POSITION(33:92)CHAR, 
        INPUTFILE                       INPUTFILENAME()CHAR
)

この制御ファイルでSQL*Loaderを呼び出すシェルスクリプトを編集するためのアクセス権も権限もないと仮定します。

4

3 に答える 3

2

11g以降、SQL*Loader制御ファイルからファイル名に直接アクセスすることはできません。

基本的に、スクリプト環境から処理する必要があります。

ロードスクリプトを変更できない場合は、データファイルにヘッダーレコードを追加できますか?

1:2の位置にレコードタイプフィールドがあるようです-ファイル名レコードタイプを含めるようにデータファイルの作成を変更できますか?

たとえば、「FN」データ型は次のとおりです。

FN                ...        inputfile.txt
DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY
DT     12345678XXX...XXXXXYYYYYYYYYYYYYYYY

ロードスクリプトは次のように変更できます。

LOAD DATA

APPEND
INTO TABLE STG_AM02_BA_RAW
WHEN (1:2) = 'FN'
(
        INPUTFILE                       POSITION(1:92)CHAR
)
WHEN (1:2) = 'DT'
(
        SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
        ACCOUNT_NO                      POSITION(19:32)CHAR, 
        SUBSCRIBER_NAME                 POSITION(33:92)CHAR
)

データファイルを更新できるかどうかによって異なります...

例えば、

echo "FNinputfile.txt" > header.txt
cat header.txt inputfile.txt > newinputfile.txt

各データ行に対してファイル名を参照する必要がある場合は、データを複数のステージングテーブルにロードできます。

LOAD DATA
TRUNCATE INTO TABLE STAGE_FILENAME
WHEN (1:2) = 'FN'
(
        INPUTFILE                       POSITION(1:92)CHAR
)
TRUNCATE INTO TABLE STAGE_DATA
WHEN (1:2) = 'DT'
(
        SUBSCRIBER_NO                   POSITION(11:18)CHAR, 
        ACCOUNT_NO                      POSITION(19:32)CHAR, 
        SUBSCRIBER_NAME                 POSITION(33:92)CHAR
)

...そしてSQLを使用してそれらを結合します:

insert into STG_AM02_BA_RAW
    (
    subscriber_no,
    account_no,
    subscriber_name,
    input_filename
    )
select
    d.subscriber_no,
    d.account_no,
    d.subscriber_name,
    f.inputfile
from
    stage_data d,
    inputfile d

同時ロードがある場合、このプロセスは失敗します。

コメントで、データファイルを変更できるとおっしゃいましたが、ファイル名が各レコードに追加されるようにファイルを変更できますか?もしそうなら、問題を解決します。以下を含める必要があります。

    SUBSCRIBER_NAME                 POSITION(92:*)CHAR
于 2009-11-09T16:11:53.293 に答える
1

あなたが指定した状況でこれを行う方法はないと思います。私の知る限り、「データ」部分でファイル名を適切に参照する方法はありません。

回避策のいくつかのアイデア:

  • 新しく挿入されたレコードを別の SQL ステートメントで更新します。SQL*Loaderを起動するバッチ・ファイルから文を作成できる場合があります。
  • ファイル名を含めるようにデータ ファイルを変更します (ここでも、バッチ ファイルから実行できます)。
  • バッチ ファイルに制御ファイルを作成させて、ファイル名を定数として含めるようにします。

    INPUTFILE CONSTANT "my_data.dat"

お役に立てれば。

于 2009-11-09T09:47:59.043 に答える
0

この問題に取り組む簡単な方法は、ファイル名を使用して各レコードの最後に列を追加し、その列の位置をフィールドにマップすることです。

于 2010-04-07T22:06:41.133 に答える