Продолжаем загрузку данных в БД Oracle. На первый взгляд, вроде уже достаточно того, что было изложено! Но есть еще несколько моментов, которые вы будете применять, может быть не часто, но это значительно облегчит вам жизнь в дальнейшем! Итак, рассмотрим загрузку по условию. Допустим, что есть данные, которые подготовлены к загрузке, но не все они нам необходимы в данное время. Можно было конечно просто загрузить их в таблицу и применив знание языка DML убрать лишнее, но можно поступить еще проще - применив условия загрузки данных. Для начала создадим табличку дубликат ORDERS и назовем ее ORDERSTWO:
CREATE TABLE MILLER.ORDERSTWO ( ORDER_NUM INTEGER PRIMARY KEY, ORDER_DATE DATE, CUST INTEGER, REP INTEGER, MFR VARCHAR2(3), PRODUCT VARCHAR2(5), QTY INTEGER, AMOUNT NUMBER ) /
Получаем:
SQL> CREATE TABLE MILLER.ORDERSTWO 2 ( 3 ORDER_NUM INTEGER PRIMARY KEY, 4 ORDER_DATE DATE, 5 CUST INTEGER, 6 REP INTEGER, 7 MFR VARCHAR2(3), 8 PRODUCT VARCHAR2(5), 9 QTY INTEGER, 10 AMOUNT NUMBER 11 ) 12 / Таблица создана.
Теперь создайте файл ORDTWO.DAT с вот таким содержимым:
112961;17-12-1989;2117;106;REI;2A44L;7;31,500 113012;11-06-1990;2111;105;ACI;41003;35;3,745 112989;03-06-1990;2101;106;FEA;114;6;1,458 113051;10-02-1990;2118;108;QSA;XK47;4;1,420 112968;12-10-1989;2102;101;ACI;41004;34;3,978 113036;30-06-1990;2107;110;ACI;4100Z;9;22,500 113045;02-02-1990;2112;108;REI;2A44R;10;45,000 112963;17-12-1989;2103;105;ACI;41004;28;3,276 113013;14-06-1990;2118;108;BIC;41003;1;652,000 113058;23-02-1990;2108;109;FEA;112;10;1,478 112997;08-06-1990;2124;107;BIC;41003;1;652,000 112983;27-12-1989;2103;105;ACI;41004;6;702,000 113024;20-06-1990;2114;108;QSA;XK47;20;7,100 113062;24-02-1990;2124;107;FEA;114;10;2,430 112979;12-10-1989;2114;102;ACI;4100Z;6;15,000 113027;22-06-1990;2103;105;ACI;41002;54;4,104 113007;08-06-1990;2112;108;IMM;773C;3;2,925 113069;02-03-1990;2109;107;IMM;775C;22;31,350 113034;29-06-1990;2107;110;REI;2A45C;8;632,00 112922;04-11-1989;2118;108;ACI;41002;10;760,000 112975;12-10-1989;2111;103;REI;2A44G;6;2,100 113055;15-02-1990;2108;101;ACI;4100X;6;150,000 113048;10-02-1990;2120;102;IMM;779C;2;3,750 112993;04-06-1989;2106;102;REI;2A45C;24;1,896 113065;27-02-1989;2106;102;QSA;XK47;6;2,130 113003;25-06-1990;2108;109;IMM;779C;3;5,625 113049;10-02-1990;2118;108;QSA;XK47;2;710,000 112987;31-12-1989;2103;105;ACI;4100Y;11;27,500 113057;18-02-1990;2111;103;ACI;4100X;24;600,34 113042;02-02-1990;2113;101;REI;2A44R;5;22,500
Самое главное проверьте, чтобы в конце файла данных для загрузки не стояло лишних символов - пробелов, табуляций и возврата каретки. Их наличие в конце файла может вызывать излишние ошибки, которые могут ввести вас в заблуждение! Далее создайте контрольный файл ORDTWO.ctl собственно загрузчика примерно вот такого содержания:
LOAD DATA INFILE 'ORDTWO.DAT' INTO TABLE ORDERSTWO WHEN MFR = 'ACI' FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS (ORDER_NUM, ORDER_DATE, CUST, REP, MFR, PRODUCT, QTY, AMOUNT ":AMOUNT * 2")
Здесь задано условие WHEN MFR = 'ACI', которое определит загрузку только данных с идентификатором ACI, все остальное будет отброшено! Так же я хочу продемонстрировать возможность использования хост переменных, которые во время загрузки данных позволяют изменять содержимое полей. Например, выражение AMOUNT ":AMOUNT * 2" увеличивает значение в столбце AMOUNT в двое! Ну и последнее создадим, исполняемый файл для загрузки данных с именем ORDTWO.bat:
..\->ORDTWO.bat @echo off set nls_lang=russian_cis.ru8pc866 sqlldr.exe userid=miller/kolobok control=ORDTWO.ctl errors=100 bad=ORDTWO.bad discard=ORDTWO.dis
После запуска получаем сообщение об успешной загрузке данных:
SQL*Loader: Release 9.2.0.1.0 - Production on Сбт Май 29 18:14:29 2004 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. Достигнута точка фиксации - счетчик логич. записей 32
Обратите внимание, что количество записей 32! Хотя в таблицу были загружены не все записи, а только 11 строк, что соответствует идентификатору ACI. Вот часть содержимого log файла после загрузки данных:
SQL*Loader: Release 9.2.0.1.0 - Production on Вск Май 30 12:28:56 2004 Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved. Управляющий файл: ORDTWO.ctl Файл данных: ORDTWO.DAT Файл плохих записей: ORDTWO.bad Файл удаленных записей: ORDTWO.dis . . . Действует опция TRAILING NULLCOLS Имя столбца Позиция Дл. Огр. Вкл Тип данных ------------------------------ ---------- ----- ---- ---- --------------------- ORDER_NUM FIRST * ; O(") CHARACTER ORDER_DATE NEXT * ; O(") CHARACTER CUST NEXT * ; O(") CHARACTER REP NEXT * ; O(") CHARACTER MFR NEXT * ; O(") CHARACTER PRODUCT NEXT * ; O(") CHARACTER QTY NEXT * ; O(") CHARACTER AMOUNT NEXT * ; O(") CHARACTER Строка SQL для столбца : ":AMOUNT * 2" Запись 1: Удалена - сбой во всех фразах WHEN. Запись 3: Удалена - сбой во всех фразах WHEN. Запись 4: Удалена - сбой во всех фразах WHEN. Запись 7: Удалена - сбой во всех фразах WHEN. . . . Запись 30: Удалена - сбой во всех фразах WHEN. Запись 31: Удалена - сбой во всех фразах WHEN. Запись 32: Удалена - сбой во всех фразах WHEN. Таблица ORDERSTWO: 11 Строки успешно загружено. 0 Строки не загружены из-за ошибки в данных. 21 Строки не загружены из-за сбоев во всех фразах WHEN. 0 Строки не загружены из-за того, что все поля были пусты. . . . Всего забраковано логических записей: 0 Всего удалено логических записей: 21 . . Процессорное время: 00:00:00.04
Как видим, строки "Запись 1: Удалена - сбой во всех фразах WHEN." как раз и показывают, что записи не соответствующие заданному условию были отброшены! Вот таким образом можно использовать условия при загрузке данных! Например, можете изменить содержимое контрольного файла на ниже следующее и догрузить еще часть данных вот так:
LOAD DATA INFILE 'ORDTWO.DAT' APPEND INTO TABLE ORDERSTWO WHEN MFR = 'REI' FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' TRAILING NULLCOLS (ORDER_NUM, ORDER_DATE, CUST, REP, MFR, PRODUCT, QTY, AMOUNT ":AMOUNT * 2")
Запустите еще раз bat файл загрузчика и записей в таблице станет 17. Посмотрим, что получилось дав запрос:
SELECT * FROM ORDERSTWO /
Получим:
SQL> SELECT * FROM ORDERSTWO 2 / ORDER_NUM ORDER_DATE CUST REP MFR PRODUCT QTY AMOUNT ----------- ----------- ---------- --------- --- ------- --------- ---------- 113012 11.06.1990 2111 105 ACI 41003 35 7,49 112968 12.10.1989 2102 101 ACI 41004 34 7,956 113036 30.06.1990 2107 110 ACI 4100Z 9 45 . . . 112975 12.10.1989 2111 103 REI 2A44G 6 4,2 112993 04.06.1989 2106 102 REI 2A45C 24 3,792 113042 02.02.1990 2113 101 REI 2A44R 5 45 17 строк выбрано.
Что собственно и следовало ожидать! Вот таким образом вы можете использовать условия при загрузке данных, что может быть особенно полезно когда загружается большое количество данных или таблицы секционированы. Пробуйте! :)