Для более полной картины работы SQL*Loader, я думаю есть смысл остановиться на том, как данные вообще загружаются в БД Oracle. Существует два способа загрузки данных БД. Обычный (conventional) и прямой (direct). Для того, чтобы активировать прямой метод загрузки необходимо в командной строке указать параметр DIRECT=TRUE. При использовании обычного (conventional) типа загрузки данных, используется SQL оператор INSERT и буферы памяти. В этот момент может возникнуть конкуренция с другими процессами за выделение ресурсов памяти в SGA. Это может привести к замедлению работы загрузчика. Так же неудобство обычного метода может заключатся в том, что SQL*Loader сканирует БД в поисках частично заполненных блоков загружаемой таблицы с целью их заполнения. Это может так же повлиять на загрузку сервера БД в целом. Но есть ряд случаев, при котором conventional метод более предпочтителен, либо вообще единственно возможный! А, именно в следующих случаях:
Схематично по этапам обычная загрузка происходит следующим образом:
При прямом методе загрузки данных, они формируются непосредственно в БД, без формирования операторов INSERT. При этом данные размещаются в памяти после существующих табличных данных. Этапы, которые имеются при прямом методе следующие:
Вот таким образом происходит прямая загрузка. Как правило я почти не пользовался direct способом, так как вполне хватало обычного метода загрузки, но представлять как это выглядит не помешает. Для простоты картины, я пока пропускаю загрузку во вложенные таблицы и VARRAY массивы. Это отдельная тематика и мы ее еще коснемся! А, пока давайте рассмотрим ряд забавных примеров использования SQL*Loader и его преимуществ! Я буду излагать все теоретически, а вы пробуйте практически, если будут ошибки пишите! Например, очень полезен вот такой примерчик.
Есть вот такой файл данных:
.dat DEPOSIT 10015 10073 DEPOSIT 10020 7525 WITHDRAWAL 10015 2000
Создадим табличку:
CREATE TABLE register ( tx_type CHAR(15), acct NUMBER, amt NUMBER ) /
Затем вот такой контрольный файл:
.ctl LOAD DATA INFILE 'month.dat' INTO TABLE register (tx_type POSITION(1:10), acct POSITION(13:17), amt POSITION(20:24) ":amt/100" )
После загрузки получим такое содержимое таблички:
SELECT * FROM register; TX_TYPE ACCT AMT --------------- ---------- ---------- DEPOSIT 10015 100.73 DEPOSIT 10020 75.25 WITHDRAWAL 10015 20
Просто и полезно! Вот еще примерчик использования последовательности Oracle и предиката USER.
Создадим вот такую последовательность:
CREATE SEQUENCE db_seq START WITH 1 INCREMENT BY 1 /
Создадим такую табличку:
CREATE TABLE load_db_seq ( seq_number NUMBER, username CHAR(30), data1 NUMBER, data2 CHAR(15) ) /
И контрольный файл:
LOAD DATA INFILE * INTO TABLE load_db_seq_delimited FIELDS TERMINATED BY "," TRAILING NULLCOLS ( seq_number "db_seq.nextval", username "USER", data1, data2 ) BEGINDATA 11111,AAAAAAAAAA 22222,BBBBBBBBBB 33333,СССССССССС
А вот содержимое после загрузки:
SELECT * FROM load_db_seq_delimited / SEQ_NUMBER USERNAME DATA1 DATA2 ---------- ---------- --------------- 1 MILLER 11111 AAAAAAAAAA 2 MILLER 22222 BBBBBBBBBB 3 MILLER 33333 СССССССССС
Простенько и со вкусом, думаю будет полезно в дальнейшем для использования - если вспомнить сколько еще переменных в Oracle фантазии могут быть самые разные! Пробуйте! :)