SQL Loader ctl файл - как пропустить столбцы - PullRequest
2 голосов
/ 08 февраля 2012

Допустим, в моей базе данных 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.

Ответы [ 3 ]

3 голосов
/ 08 февраля 2012

Если это вариант, просто отбросьте третий столбец с помощью инструмента оболочки.Это просто работает .

Например, с awk:

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

Или с sed:

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

(и вы можетевыберите несколько других инструментов (например, cut ...)

1 голос
/ 08 февраля 2012

Я действительно не знаю, поддерживается ли это в более ранних версиях, но в более поздних версиях вы можете использовать оператор SQL :

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

... который установит Column3 в ноль, независимо от того, имеет ли оно значение в файле данных или нет.

0 голосов
/ 08 февраля 2012

Один из подходов заключается в использовании промежуточной таблицы или таблицы нагрузки, например:

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;
...