1

SQLローダーでIFCLAUSEを使用することは可能ですか?コードを書いたのですが、エラーが発生します。

INTO TABLE TF_RTB9_DTL 
WHEN ((01) = 'D') OR (if 
(POA_COU_VAL = 0) 
then MAST_POA_ID = null 
end if) 
FIELDS TERMINATED BY "~" OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
( 

TRANS_TYP POSITION(3), 
BO_ID , 
NAME , 
MID_NAM , 
LAS_NAM , 
PAN , 
NAM_FIR_JOINT , 
MIDD_NAM_FIR_JOINT, 
LAS_NAM_FIR_JOINT , 
PAN_FIR_JOINT , 
NAM_SEC_JOINT , 
MIDD_NAM_SEC_JOINT, 
LAS_NAM_SEC_JOINT , 
PAN_SEC_JOINT , 
ADD_LIN_1 , 
ADD_LIN_2 , 
ADD_LIN_3, 
CITY , 
STATE , 
COUNTRY , 
PIN_COD , 
PERM_ADD_LIN_1 , 
PERM_ADD_LIN_2 , 
PERM_ADD_LIN_3 , 
PERM_CITY , 
PERM_STATE , 
PERM_COUNTRY , 
PERM_PIN_COD , 
POA_COU_VAL , 
MAST_POA_ID , 
TRANS_ID 
)

POA_COU_VALが0の場合、POA_COU_VALはnullである必要があり、次の値をTRANS_IDに入力する必要があります。どうすればこれを達成できますか?

4

2 に答える 2

4

SQL*Loader は、大量のデータをロードするためのプログラムです。ロード プロセス中にデータを操作する機能は限られています。

データを変換する場合は、代わりに外部テーブルを使用する必要があります。これらは SQL*Loader と非常によく似ています (定義は実質的に同じ構文を使用しますが、データ ファイルをテーブルとしてデータベースに提示します。つまり、SQL を使用できるということです。そのため、コマンド ラインから SQL*Loader を呼び出す代わりに、次のような挿入ステートメントを実行します。

insert into target_table
select * from external table;

あなたの状況でのみ、SELECT 句のプロジェクトを展開する必要があるので、追加のロジックを実装するために CASE() ステートメントを含めることができます。

外部テーブルの詳細については、こちらをご覧ください。

于 2012-08-02T07:46:55.683 に答える
1

SQL*LoaderWHEN句には限られたブール演算子のみがあり、特にOR欠落しています ( http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_control_file.htm#i1005657を参照)。

SQL*Loader を使用する必要ある (そして APC が提案したように外部テーブルに切り替えることができない) 場合は、句INTOの各部分のセクションを乗算する必要があります。OR

例えば:

INTO TABLE TF_RTB9_DTL 
WHEN (01) = 'D'
FIELDS TERMINATED BY "~" OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
( 
TRANS_TYP POSITION(3),
...      
...      
MAST_POA_ID
)
INTO TABLE TF_RTB9_DTL 
WHEN POA_COU_VAL = '0'
FIELDS TERMINATED BY "~" OPTIONALLY ENCLOSED BY '"' 
TRAILING NULLCOLS 
( 
TRANS_TYP POSITION(3),
...      
...      
MAST_POA_ID "NULL"
)

または、NULLIF関数の使用を検討してください ( http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_field_list.htm#i1009345 )

...
MAST_POA_ID NULLIF POA_COU_VAL = '0'
...

SQL*Loader はトリッキーなツールです。外部テーブルを使用できれば、おそらくより迅速に結果を得ることができます (ファイルは Oracle Server マシン上にある必要がありますが、SQL*Loader は任意の Oracle インスタンスに接続できます)。

于 2012-08-03T14:01:48.057 に答える