Как загрузить данные из CSV файла с выбором строк по условию INTO TABLE WHEN?
Есть CSV файл. Пример данных:
Data1|data2|data3
Data4|data5|data6
Ctr|1|2
Lst|1|30
Lst|1|40
Lst|1|50
Data7|data8|data9
Ctr|2|3
Lst|2|60
Lst|2|70
Таблица, куда эти данные должны быть загружены:
create table me.control (dtype varchar2 (8), Idctl varchar2 (8), ltype varchar2 (8), Idsub varchar2 (8));
Используя SQL*Loader хочу получить такой результат:
dtype | Idctl|ltype | Idsub
------+------+-------+------
Ctr | 1 | NULL | 2
Lst | 1 | 30 | NULL
Lst | 1 | 40 | NULL
Lst | 1 | 50 | NULL
Ctr | 2 | NULL | 3
Lst | 2 | 60 | NULL
Lst | 2 | 70 | NULL
Пробовл со следуюшими параметрами в контрольном файле:
LOAD DATA
CHARACTERSET UTF8
TRUNCATE
INTO TABLE control WHEN (1:3) = 'Ctr'
FIELDS TERMINATED BY "|"
TRAILING NULLCOLS (
dtype CHAR,
Idctl CHAR,
Idsub CHAR)
INTO TABLE control WHEN (1:3) = 'Lst'
FIELDS TERMINATED BY "|"
TRAILING NULLCOLS (
dtype CHAR,
Idctl CHAR,
ltype CHAR)
Но вторая часть не загрузилась - 0 записей.
DTYPE IDCTL LTYPE IDSUB
-------- -------- -------- --------
Ctr 1 null 2
Ctr 2 null 3
Как это можно исправить?
Свободный перевод вопроса Load data from multiple lines with condition controller от участника @fati lem
Ответы (1 шт):
Как сказано в документации:
Note: A key point when using multiple
INTO TABLEclauses is that field scanning continues from where it left off when a newINTO TABLEclause is processed. The remainder of this section details important ways to make use of that behavior. It also describes alternative ways of using fixed field locations or thePOSITIONparameter.
При обработке условия Lst, SQL*Loader продолжает искать столбцы в текущей строке.
Можно сбросить это условие, определив первое поле с параметром position для сброса в начало строки:
into table control when dtype = 'Ctr'
fields terminated by "|"
trailing nullcols (
dtype CHAR,
Idctl CHAR,
Idsub CHAR)
into table control when dtype = 'Lst'
fields terminated by "|"
trailing nullcols (
dtype position(1:3) CHAR,
Idctl CHAR,
ltype CHAR)
BEGINDATA
Data1|data2|data3
Data4|data5|data6
Ctr|1|2
Lst|1|30
Lst|1|40
Lst|1|50
Data7|data8|data9
Ctr|2|3
Lst|2|60
Lst|2|70
Результат:
$ sqlldr me/me@dbsrv/pdb1 control=test.ctl
Table CONTROL:
2 Rows successfully loaded.
Table CONTROL:
5 Rows successfully loaded.
Свободный перевод ответа от участника @Chris Saxon