假设在我的数据库中有4列:
Column1, Column2, Column3, Column4
我的数据文件是CSV文件(逗号分隔,列长度未知):
xxx,yyy,zzz,000
a,bb,ccccc,ddddddd
1,2,3,4
CTL将是:
LOAD DATA
INTO TABLE "TABLE"
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
Column1,
Column2,
Column3,
Column4
)
我想跳过第3列,我该怎么做?我知道FILLER
,但它不适用于旧的oracle版本。
如果这是一个选项,只需使用shell工具删除第三列。这就是的作用。
例如,使用awk
:
awk 'BEGIN { FS="," } { print $1 FS $2 FS $4 }' INFILE > TMPOUTFILE
或使用sed
:
sed 's/^([^,]+,[^,]+,)[^,]+,/1/' INFILE > TMPOUTFILE
(您可以选择其他几个工具(例如cut
…)
我真的不知道早期版本是否支持这一点,但在以后的版本中,您可以使用SQL运算符:
LOAD DATA
INTO TABLE "TABLE"
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
Column1,
Column2,
Column3 "decode(:Column3,null,null,null)",
Column4
)
无论CCD_ 5在数据文件中是否具有值。
一种方法是使用中间表或加载表,如下所示:
LOAD DATA
INTO TABLE "LOADTABLE"
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
Column1,
Column2,
Column3,
Column4
)
然后调用一个存储过程来处理主表的填充,类似于以下内容:
CREATE PROCEDURE pop_table
IS
CURSOR cur_load_table
IS
SELECT column1
, column2
, column4
FROM loadtable;
BEGIN
FOR rec IN cur_load_table
LOOP
INSERT INTO table( column1
, column2
, column4 )
VALUES ( rec.column1
, rec.column2
, rec.column4 );
END LOOP;
END pop_table;