SQL加载程序ctl文件-如何跳过列
假设在我的数据库中有4列:SQL加载程序ctl文件-如何跳过列,sql,oracle,sql-loader,ctl,Sql,Oracle,Sql Loader,Ctl,假设在我的数据库中有4列: Column1, Column2, Column3, Column4 我的数据文件是CSV文件(逗号分隔,列长度未知): CTL将是: LOAD DATA INTO TABLE "TABLE" FIELDS TERMINATED BY ',' TRAILING NULLCOLS ( Column1, Column2, Column3, Column4 ) 我想跳过第三栏,我该怎么做?我知道FILLER,但它不适用于旧
Column1, Column2, Column3, Column4
我的数据文件是CSV文件(逗号分隔,列长度未知):
CTL将是:
LOAD DATA
INTO TABLE "TABLE"
FIELDS TERMINATED BY ',' TRAILING NULLCOLS
(
Column1,
Column2,
Column3,
Column4
)
我想跳过第三栏,我该怎么做?我知道FILLER,但它不适用于旧的oracle版本。一种方法是使用中间表或加载表,如下所示:
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;
一种方法是使用中间表或加载表,如下所示:
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;
我真的不知道早期版本是否支持此功能,但在以后的版本中,您可以使用:
。。。它会将
Column3
设置为null,无论它在数据文件中是否有值。我真的不知道早期版本是否支持此功能,但在以后的版本中,您可以使用:
。。。无论数据文件中是否有值,它都会将
Column3
设置为null。如果是选项,只需使用shell工具删除第三列即可。那只是工作
例如,使用awk
:
awk 'BEGIN { FS="," } { print $1 FS $2 FS $4 }' INFILE > TMPOUTFILE
或使用sed
:
sed 's/^\([^,]\+,[^,]\+,\)[^,]\+,/\1/' INFILE > TMPOUTFILE
(您可以选择其他几种工具(例如,
cut
..)如果可以选择,只需使用shell工具删除第三列即可。这很有效
例如,使用awk
:
awk 'BEGIN { FS="," } { print $1 FS $2 FS $4 }' INFILE > TMPOUTFILE
或使用sed
:
sed 's/^\([^,]\+,[^,]\+,\)[^,]\+,/\1/' INFILE > TMPOUTFILE
(您可以选择其他几种工具(例如,
cut
…)您使用的Oracle版本是什么?不同的版本包括<8您使用的Oracle版本是什么?不同的版本包括<8