让我们在我的数据库中列出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
)
我想跳过Column3,我该怎么做?我知道FILLER
但它不适用于旧的oracle版本。
答案 0 :(得分:3)
如果这是一个选项,只需使用shell工具删除第三列。那个只是起作用。
E.g。与awk
:
awk 'BEGIN { FS="," } { print $1 FS $2 FS $4 }' INFILE > TMPOUTFILE
或sed
:
sed 's/^\([^,]\+,[^,]\+,\)[^,]\+,/\1/' INFILE > TMPOUTFILE
(您可以选择其他几种工具(例如cut
...)
答案 1 :(得分:1)
我真的不知道早期版本是否支持此版本,但在以后的版本中,您可以使用SQL operator:
LOAD DATA
INTO TABLE "TABLE"
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
Column1,
Column2,
Column3 "decode(:Column3,null,null,null)",
Column4
)
...将Column3
置为null,无论它是否在数据文件中有值。
答案 2 :(得分:0)
一种方法是使用中间表或加载表,如下所示:
LOAD DATA
INTO TABLE "LOADTABLE"
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
Column1,
Column2,
Column3,
Column4
)
然后调用存储的proc来处理主表的填充,如下所示:
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;