2

假设在我的数据库中 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 版本。

4

3 回答 3

3

如果这是一个选项,只需使用 shell 工具删除第三列。那行得通

例如awk

awk 'BEGIN { FS="," } { print $1 FS $2 FS $4 }' INFILE > TMPOUTFILE

或与sed

sed 's/^\([^,]\+,[^,]\+,\)[^,]\+,/\1/' INFILE > TMPOUTFILE

(您可以选择其他几种工具(例如cut...)

于 2012-02-08T10:29:31.657 回答
1

我真的不知道早期版本是否支持此功能,但在以后的版本中,您可以使用SQL 运算符

LOAD DATA
INTO TABLE "TABLE" 
FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(
    Column1,
    Column2,
    Column3 "decode(:Column3,null,null,null)",
    Column4
)

...Column3无论它在数据文件中是否有值,都将设置为 null。

于 2012-02-08T10:07:48.537 回答
0

一种方法是使用中间表或加载表,如下所示:

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;
于 2012-02-08T08:38:13.157 回答