Шаг 139 - БД Oracle - SQL*Loader Cпособы загрузки - ЧАСТЬ III

Продолжаем загрузку данных в БД 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 строк выбрано.

Что собственно и следовало ожидать! Вот таким образом вы можете использовать условия при загрузке данных, что может быть особенно полезно когда загружается большое количество данных или таблицы секционированы. Пробуйте! :)


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Летучий Сергей - 14.06.2004