3

次のテーブルがあるとします。

CREATE TABLE Customer
(
  batch_id         NUMBER,
  customer_name    VARCHAR2(20),
  customer_address VARCHAR2(100)
)

そして、このテーブルに入力するための制御ファイルがあるとします。

LOAD DATA INFILE 'customers.dat'
交換

INTO TABLE 顧客
(
  バッチ ID ??????、
  顧客名 POSITION(001:020),
  customer_address POSITION(021:120)
)

batch_idSQL*Loader の実行時に制御ファイルに値を渡すことはできますか? たとえば、バインド変数を指定することは可能ですか (疑問符を に変えます:MY_AWESOME_BATCH_ID)。

4

3 に答える 3

8

アーカイブする比較的簡単な方法は、バッチ番号を返すストアド関数を作成し、それをローダー ファイルで使用することです。

create or replace function getBatchNumber return number as
begin
  return 815;
end;
/

LOAD DATA INFILE 'customers.dat'
REPLACE

INTO TABLE Customer
(
  batch_id         "getBatchNumber",
  customer_name    POSITION(001:020),
  customer_address POSITION(021:120)
)
于 2010-09-21T13:19:41.327 に答える
3

私の記憶が正しければ簡単ではありませんが、いくつかの代替手段があります。

  • 一度に 1 つのプロセスしか SQLローダーを実行しない場合は、null または固定値を使用し、その後プロセスの一部として SQL Plus スクリプトを実行して、シーケンス値を更新します。
  • バッチ ID の次のシーケンス値を取得するスクリプトを呼び出し、batch_id 定数を含む制御ファイルをスプールします。
于 2010-09-21T13:09:04.473 に答える
1

負荷ごとにインクリメントして BATCH_ID 値を自動的に生成することが許容される場合、これは私にとってはうまくいきました。サンプルの 10 分の間隔は、特定の負荷に合わせて調整する必要があります。正確を期すには、指定された間隔内に読み込みが完了し、次の読み込みが指定された時間内に開始されないようにする必要があります。

欠点は、ボリュームが大きいと速度が著しく低下することです。これは、すべてのラインで MAX 集計を実行する価格です。

LOAD DATA
...
INTO TABLE XYZ 
(
...
BATCH_ID expression "(select nvl(max(batch_id) + 1, 1) from extra_instruments_party_to where create_date < (sysdate - interval '10' minute))",
CREATE_DATE SYSDATE
)
于 2012-05-18T21:17:01.430 に答える