如果是SQL Loader中的Clause

时间:2012-08-02 05:15:25

标签: sql oracle oracle10g sql-loader

可以在sql loader中使用IF CLAUSE吗?我写了一段代码,但它给了我错误。

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中输入下一个值。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

SQL * Loader WHEN子句只有有限的布尔运算符,尤其缺少OR(参见http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_control_file.htm#i1005657)。

如果 使用SQL * Loader(并且无法像APC建议的那样切换到外部表),则需要将INTO部分乘以{{1}的每个部分1}}子句。

例如:

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" ) 函数(http://docs.oracle.com/cd/B19306_01/server.102/b14215/ldr_field_list.htm#i1009345

NULLIF

SQL * Loader是一个棘手的工具,如果你能够使用外部表,你最有可能获得更快的结果(文件必须在Oracle Server机器上,而SQL * Loader能够连接到任何Oracle实例)。