2

empId と status (Y/N) の 2 つの列を格納するテーブル (informix 内) があります。実行すると、特定の条件に基づいてこれらの従業員 ID のステータスを更新するスクリプトが他にもいくつかあります。当面のタスクは、ユーザーが従業員 ID を含むファイルへのパスを提供することです。このファイルを見て、「user_supplied_file挿入からemployeeStatusTableへのロード」を行うスクリプトがあります。このファイルに記載されているすべての従業員 ID は、ステータス「N」でこのテーブルに挿入されます。実際の問題は、ユーザーが指定したファイルに、(他のスクリプトまたはジョブによって) ステータスが「Y」に更新されたテーブルに既に存在する employeeId が含まれている可能性があることです。この場合、既存のエントリは上書きされます。つまり、テーブルのエントリは「empId」、「N」となるはずです。

これを達成する方法はありますか?前もって感謝します。

4

1 に答える 1

3

私の知る限り、LOADステートメントはINSERTステートメントと一緒に使用することに限定されています。これを行うには多くの方法があると確信しています。2つの方法をお勧めします。

どちらの場合も、データベース バージョン >= 11.50 でのみサポートされており、次のような特定の制限があります。

  • マージは、2 つのテーブルが 1 対 1 の関係にある場合にのみ機能します。
  • 外部テーブルはデータベース サーバーのファイル システムに限定され、クライアント マシン上のものにはアクセスしません

提案 1

一時テーブルにロードしてから、MERGEステートメントを使用します。

create temp table tp01 ( cols.... ) with no log ; 
load from xyz.txt insert into tp01 ; 
merge into destTable as A
  using tp01 as B 
  ON A.empID = B.empID
  WHEN MATCHED THEN UPDATE SET status = 'N'
  WHEN NOT MATCHED THEN INSERT (empid, status) values ( b.empid, 'N');
drop table tp01;

提案 2

TXT ファイルに外部テーブルを作成し、必要に応じてこのテーブルを使用して MERGE または UPDATE を使用します。

create external table ex01 .... using ( datafile('file:/tmp/your.txt'), delimited ...);
merge into destTable as A
  using ex01 as B 
  ON A.empID = B.empID
  WHEN MATCHED THEN UPDATE SET status = 'N'
  WHEN NOT MATCHED THEN INSERT (empid, status) values ( b.empid, 'N');
于 2013-01-30T15:32:41.090 に答える