ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.






        ГЛАВА 5  ПРИМЕРЫ РАБОТЫ SQL*LOADER
        ---------------------------------Д

    Примеры, содержащиеся в настоящей главе, иллюстрируют некото-
рые особенности работы утилиты SQL*Loader. Изложение начинается с
простых примеров и заканчивается более сложными.  Демонстрируется
загрузка следующих объектов:
    * данных переменной длины
    * записей фиксированного формата
    * файла  в  свободном  формате  с использованием разделителей
      между данными
    * нескольких физических записей как одной логической
    * нескольких таблиц
    Вы можете потренироваться сами, используя учебные файлы, ука-
занные в данной главе.  Все они имеются на дистрибутиве, содержа-
щем утилиту SQL*Loader.

    Описание примеров
    -----------------
    Краткое описание каждого примера:
    Пример 1:  Загрузка записей переменной длины,  в которых поля
разделяются запятыми и могут быть заключены  в  кавычки.   Данные
располагаются в конце управляющего файла.
    Пример 2:  Загрузка данных из файла,  состоящего  из  записей
фиксированной длины и фиксированного формата.
    Пример 3:  Загрузка записей переменной длины,  в которых  ис-
пользуются ограничители и порядковые номера. Данные располагаются
в конце управляющего файла.
    Пример 4:   Объединение  нескольких физических записей в одну
логическую, которой соответствует одна строка БД.
    Пример 5:   Загрузка данных в несколько таблиц сразу (в одном
сеансе).
    Дистрибутив, на котором находится утилита SQL*Loader,  содер-
жит для каждого из указанных примеров по одному или по два файла:
управляющий файл и файл данных.  Эти файлы называются CASE1.CTL и
CASE1.DAT (для первого примера) и т.д.
    Все примеры  основаны на использовании стандартных демонстра-
ционных таблиц БД ORACLE EMP и DEPT,  принадлежащих  пользователю
SCOTT/TIGER; таблицы описаны следующим образом:

    CREATE TABLE EMP
        (EMPNO      NUMBER(4)  NOT NULL,
        ENAME       CHAR(10),
        JOB         CHAR(9),
        MGR         NUMBER(4),
        HIREDATE    DATE,
        SAL         NUMBER(7,2),
        COMM        NUMBER(7,2),
        DEPTNO      NUMBER(2))
    CREATE TABLE DEPT
        (DEPTNO     NUMBER(2),
        DNAME       CHAR(14),
        LOC         CHAR(13))

    В некоторых  из примеров для повышения наглядности демонстри-
руемых положений в таблицы будут добавлены дополнительные  столбцы.



                                    -- 47 --



    Пример 1: Загрузка данных переменной длины
    ------------------------------------------
    В этом примере демонстрируется следующее:
    * формат  управляющего  файла,  описывающего одну загружаемую
      таблицу с тремя столбцами
    * включение  данных  в  состав управляющего файла (отсутствие
      отдельного файла данных)
    * загрузка полей и записей переменной длины
    Номера слева в приводимом ниже листинге содержимого управляю-
щего файла (CASE1.CTL) в самом файле отсутствуют; они используют-
ся в комментариях к файлу,  следующих дальше. При создании управ-
ляющего файла эти номера не вводятся.

    1     LOAD DATA
    2     INFILE *
    3     INTO TABLE DEPT
    4     FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
    5     (DEPTNO, DNAME, LOC)
    6     BEGINDATA
          12,RESEARCH,"SARATOGA"
          10,"ACCOUNTING",CLEVELAND
          11,"ART",SALEM
          13,FINANCE,"BOSTON"
          21,"SALES",PHILA.
          22,"SALES",ROCHESTER
          42,"INT'L","SAN FRAN"

    Комментарии:
    1     Оператор LOAD DATA открывает управляющий файл.
    2     Данные содержатся в управляющем файле.
    3     Оператор INTO TABLE идентифицирует  загружаемую таблицу
          (DEPT). По умолчанию таблица, в которую добавляются за-
          писи, должна быть вначале пустой.
    4     Данные разделяются запятыми, но могут быть также заклю-
          чены в кавычки.  Тип данных для всех полей по умолчанию
          - CHAR.
    5     Имена загружаемых столбцов  заключаются в круглые скобки.
    6     Указание начала данных.

    Запуск утилиты  SQL*Loader в данном примере может быть произ-
веден следующим образом:
    SQLLOAD SCOTT/TIGER CASE1.CTL
    Результатом работы утилиты SQL*Loader является загрузка  таб-
лицы DEPT и создание двух файлов: регистрационного и файла плохих
записей (файл плохих записей создается,  невзирая на то, отверга-
ются ли в процессе загрузки какие-либо записи или нет).
    Ниже представлен регистрационный файл. Номера слева имеют от-
ношение к комментариям, помещенным после файла; в самом регистра-
ционном файле они отсутствуют.

    ------------------------------------------------------------Д
    Control File:         case1.ctl
    Data File:            *
       Read Mode:         System Record
       Bad File:          case1.bad
       Discard File:      none specified



                                    -- 48 --



    Number to load:       ALL
    Number to skip:       0
    Errors allowed:       50
    Bind array:           64 rows, maximum of 65336 bytes
    Record Length:        726 (Buffer size allocated per logical
                          record)
    Continuation:         none specified

    Table DEPT, loaded from every logical record.
    Insert option in effect for this table: INSERT

          Column Name  Position  Len  Term  Encl  Datatype
          -----------  --------  ---  ----  ----  ---------
    1     DEPTNO       FIRST     *     ,    O(")  CHARACTER
          DNAME        NEXT      *     ,    O(")  CHARACTER
    2     LOC          NEXT      *    WHT   O(")  CHARACTER

    Table DEPT:
          7 Rows successfully loaded.
          0 Rows not loaded due to data errors.
          0 Rows not loaded because all WHEN clauses were failed.
          0 Rows not loaded because all fields were null.

    продолжение следует ...

    Space allocated for bind array:    46848 bytes (64 rows)
    Space otherwise allocated:         48084 bytes

    Total logical records skipped:           0
    Total logical records read:              0
    Total logical records rejected:          0
    Total logical records discarded:         0
    ------------------------------------------------------------Д
    Комментарии:
    1     Расположение и длина каждого поля в записи определяются
          по положению ограничителей.
    2     Выражение "WHT" означает, что поле LOC завершается пос-
          ледовательностью пробелов  (whitespace).   Запись  O(")
          указывает на то, что значение поля может быть заключено
          в кавычки.

    Пример 2: Загрузка записей фиксированного формата
    -------------------------------------------------------------

    Пример 2 демонстрирует следующее:
    * формат управляющего файла,  описывающего файл данных и одну
      загружаемую таблицу
    * выделение данных в отдельный файл
    * фиксированный формат файла данных
    В управляющем  файле расположение столбцов и типы данных ука-
заны явно.
    Номера слева в приводимом ниже листинге содержимого управляю-
щего файла (CASE2.CTL) в самом файле отсутствуют; они используют-
ся в комментариях к файлу,  следующих дальше. При создании управ-
ляющего файла эти номера не вводятся.




                                    -- 49 --



    1     LOAD DATA
    2     INFILE CASE2.DAT
    3     INTO TABLE EMP
    4     (EMPNO         POSITION (01:04)    INTEGER EXTERNAL,
          ENAME          POSITION (06:15)    CHAR,
          JOB            POSITION (17:25)    CHAR,
          MGR            POSITION (27:30)    INTEGER EXTERNAL,
          SAL            POSITION (32:39)    DECIMAL EXTERNAL,
          COMM           POSITION (41:48)    DECIMAL EXTERNAL,
    5     DEPTNO         POSITION (50:51)    INTEGER EXTERNAL)

    Комментарии:
    1     Оператор LOAD DATA открывает управляющий файл.
    2     Имя файла, содержащего данные, указывается после ключе-
          вого слова INFILE.
    3     Оператор INTO TABLE идентифицирует загружаемую таблицу.
    4     Каждая следующая строка  (по строку с номером 5 включи-
          тельно) содержит  имя  столбца  и описание расположения
          загружаемых в столбец значений в файле данных.   EMPNO,
          ENAME, JOB и т.д.  - имена столбцов в таблице EMP. Типы
          данных (INTEGER EXTERNAL, CHAR, DECIMAL EXTERNAL) соот-
          ветствуют типам тех данных, которые содержатся в инфор-
          мационных полях файла,  а не тех,  которые содержатся в
          соответствующих столбцах таблицы EMP.
    5     Обратите  внимание  на то,  что  перечень  спецификаций
          столбцов заключается в скобки.

    Ниже приводятся несколько строк из файла CASE2.DAT.

    7782 CLARK      MANAGER   7839  2572.50          10
    7839 KING       PRESIDENT       5500.00          10
    7934 MILLER     CLERK     7782   920.00          10
    7566 JONES      MANAGER   7839  3123.75          20
    7499 ALLEN      SALESMAN  7698  1600.00   300.00 30
    7654 MARTIN     SALESMAN  7698  1312.50  1400.00 30
    7658 CHAN       ANALYST   7566  3450.00          20

    Поля, заполненные пробелами,  автоматически получают значение
"пусто" (null).
    Запуск утилиты  SQL*Loader в данном примере может быть произ-
веден следующим образом:
    SQLLOAD SCOTT/TIGER CASE2.CTL CASE2.LOG
    Результатом работы утилиты SQL*Loader является загрузка  таб-
лицы EMP и создание двух файлов:  регистрационного и файла плохих
записей (файл плохих записей создается,  невзирая на то, отверга-
ются ли в процессе загрузки какие-либо записи или нет).

    Регистрационный файл имеет следующий вид.

    Control File:         case2.ctl
    Data File:            CASE2.DAT
    Read Mode:            System Record
    Bad File:             case2.bad
    Discard File:         none specified

    Number to load:       ALL
    Number to skip:       0
    Errors allowed:       50

                                    -- 50 --



    Bind array:           64 rows, maximum of 65336 bytes
    Record Length:        80 (Buffer size allocated per logical record)
    Continuation:         none specified

    Table EMP, loaded from every logical record.
    Insert option in effect for this table: INSERT

    Column Name    Position    Len    Term    Encl    Datatype
    -----------    --------    ---    ----    ----    ---------
    EMPNO            1:4         4                    CHARACTER
    ENAME            6:15       10                    CHARACTER
    JOB             17:25        9                    CHARACTER
    MGR             27:30        4                    CHARACTER
    SAL             32:39        8                    CHARACTER
    COMM            41:48        8                    CHARACTER
    DEPTNO          50:51        2                    CHARACTER

    Table EMP:
          20 Rows successfully loaded.
          0 Rows not loaded due to data errors.
          0 Rows not loaded because all WHEN clauses were failed.
          0 Rows not loaded because all fields were null.

    Space allocated for bind array:    3776 bytes (64 rows)
    Space otherwise allocated:         6740 bytes

    Total logical records skipped:           0
    Total logical records read:             20
    Total logical records rejected:          0
    Total logical records discarded:         0

    Пример 3: Загрузка файла в свободном формате с использованием
    разделителей между данными
    -------------------------------------------------------------

    Пример 3 демонстрирует следующее:
    * загрузку данных в потоковом формате с использованием разде-
      лителей двух типов - завершающих и окаймляющих
    * загрузку дат
    * включение данных, подлежащих загрузке, в состав управляюще-
      го файла   (начало   данных   отмечается   ключевым  словом
      BEGINDATA)
    * использование  функции  SEQUENCE  для  генерации уникальных
      значений ключей, добавляемых в загружаемые данные
    * использование  ключевого слова APPEND,  указывающего на то,
      что таблица, в которую добавляются данные, может уже содер-
      жать к началу загрузки какую-либо информацию
    * использование в управляющем файле комментариев, начинающих-
      ся с двойного тире
    Рассматриваемый здесь управляющий файл выполняет загрузку той
же таблицы,  что и в примере 2,   но  с  тремя  новыми  столбцами
(HIREDATE, PROJNO,   LOADSEQ).   В  демонстрационной  таблице EMP
столбцы PROJNO и LOADSEQ отсутствуют,  поэтому прежде чем  запус-
кать этот  файл,  необходимо указанные столбцы добавить в таблицу
командой:
    ALTER TABLE EMP ADD (PROJNO NUMBER, LOADSEQ NUMBER)



                                    -- 51 --



    По сравнению с примером 2 данные имеют другой  формат.   Одни
значения заключены в кавычки, другие разделяются запятыми, а зна-
чения полей DEPTNO и PROJNO - двоеточием.

    Номера слева в приводимом ниже листинге содержимого управляю-
щего файла  в самом файле отсутствуют; они используются в коммен-
тариях к файлу, следующих дальше. При создании управляющего файла
эти номера не вводятся.

    1    -- Variable-length, delimited and enclosed data format
         LOAD DATA
    2    INFILE *
    3    APPEND
         INTO TABLE EMP
    4    FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
         (empno, ename, job, mgr,
    5    hiredate DATE "DD-Month-YYYY",
         sal, comm,
         deptno CHAR TERMINATED BY ':',
         projno,
    6    loadseq SEQUENCE (MAX,1))
    7    BEGINDATA
    8    7782,"Clark","Manager",7839,09-June-1981,2572.50,,10:101
         7839,"King","President",,17-November-1981,5500.00,,10:102
         7934,"Miller","Clerk",7782,23-January-1982,920.00,,10:102
         7566,"Jones","Manager",7839,02-April-1981,3123.75,,20:101
         7499,"Allen","Salesman",7698,20-February-1981,1600.00,
         (продолжение предыдущей строки)     300.00,30:103
         7654,"Martin","Salesman",7698,28-September-1981,1312.50,
         (продолжение предыдущей строки)     1400.00,30:103
         7658,"Chan","Analyst",7566,03-May-1982,3450,,20:101

    Комментарии:
    1     Комментарии могут появиться в любой из  командных строк
          файла, но не в строках данных.  Им предшествует двойное
          тире, которое может располагаться в любом месте строки.
    2     Указание на то,  что данные находятся в конце управляю-
          щего файла.
    3     Указание на то, что данные могут загружаться даже в том
          случае, если таблица уже содержит какие-то строки.
    4     По умолчанию разделителем значений информационных полей
          является запятая,   значения некоторых полей могут быть
          заключены в двойные кавычки.
    5     Данные,  загружаемые  в столбец HIREDATE,  имеют формат
          DD-Month-YYYY (DD - число, Month - месяц, YYYY - год).

    6     Функция SEQUENCE используется для генерации  уникальных
          значений, добавляемых в столбец LOADSEQ.  Функция нахо-
          дит максимальное из имеющихся в столбце значений и  до-
          бавляет к  нему единицу,  получая в результате значение
          столбца LOADSEQ для вновь добавляемой строки.
    7     Указание конца управляющей информации и начала данных.
    8     Обратите внимание на то, что хотя каждая физическая за-
          пись и эквивалентна одной логической, длина полей варь-
          ируется так,  что некоторые записи выглядят длиннее ос-
          тальных. Заметьте  также,  что несколько строк содержат
          пустые значения для столбца COMM.


                                    -- 52 --



    Запуск утилиты  SQL*Loader в данном примере может быть произ-
веден следующим образом:
    SQLLOAD SCOTT/TIGER CASE3.CTL CASE3.LOG CASE3.BAD

    Регистрационный файл имеет следующий вид.

    Control File:         case3.ctl
    Data File:            *
    Read Mode:            System Record
    Bad File:             case3.bad
    Discard File:         none specified

    Number to load:       ALL
    Number to skip:       0
    Errors allowed:       50
    Bind array:           64 rows, maximum of 65336 bytes
    Record Length:        2182 (Buffer size allocated per logical
                          record)
    Continuation:         none specified

    Table EMP, loaded from every logical record.
    Insert option in effect for this table: APPEND

    Column Name    Position    Len    Term    Encl    Datatype
    -----------    --------    ---    ----    ----    ---------
    empno          FIRST        *       ,     O(")    CHARACTER
    ename          NEXT         *       ,     O(")    CHARACTER
    job            NEXT         *       ,     O(")    CHARACTER
    mgr            NEXT         *       ,     O(")    CHARACTER
    hiredate       NEXT         *       ,     O(")    CHARACTER
    sal            NEXT         *       ,     O(")    CHARACTER
    comm           NEXT         *       ,     O(")    CHARACTER
    deptno         NEXT         *       :     O(")    CHARACTER
    projno         NEXT         *       ,     O(")    CHARACTER
    loadseq        SEQUENCE (MAX, 1)

    Table EMP:
    7 Rows successfully loaded.
    0 Rows not loaded due to data errors.
    0 Rows not loaded because all WHEN clauses were failed.
    0 Rows not loaded because all fields were null.

    Space allocated for bind array:   63800 bytes (29 rows)
    Space otherwise allocated:        64163 bytes

    Total logical records skipped:           0
    Total logical records read:              7
    Total logical records rejected:          0
    Total logical records discarded:         0

    Пример 4:   Загрузка  нескольких физических записей как одной
    логической
    -------------------------------------------------------------

    Пример 4 демонстрирует следующее:
    * объединение нескольких физических записей в одну логическую
    * использование ключевого слова CONTINUEIF
    * загрузку отрицательных значений

                                    -- 53 --



    * использование ключевого слова REPLACE,  указывающего на то,
      что новые записи,  загружаемые в таблицу,  должны  заменять
      собой старые
    * указание имени файла отсеянных записей с помощью  ключевого
      слова DISCARDFILE
    * указание верхнего ограничения на количество отсеиваемых за-
      писей с помощью ключевого слова DISCARDMAX
    * фильтрацию записей,  имеющих повторяющиеся значения в  поле
      уникального индекса
    * фильтрацию записей, содержащих недопустимые значения
    Номера слева в приводимом ниже листинге содержимого управляю-
щего файла (CASE4.CTL) в самом файле отсутствуют; они используют-
ся в комментариях к файлу,  следующих дальше. При создании управ-
ляющего файла эти номера не вводятся.

          LOAD DATA
          INFILE case4.dat
    1     DISCARDFILE case4.dis
    2     DISCARDMAX 999
    3     REPLACE
    4     CONTINUEIF THIS (1) = '*'
          INTO TABLE EMP
          (EMPNO         POSITION (01:04)    INTEGER EXTERNAL,
          ENAME          POSITION (06:15)    CHAR,
          JOB            POSITION (17:25)    CHAR,
          MGR            POSITION (27:30)    INTEGER EXTERNAL,
          SAL            POSITION (32:39)    DECIMAL EXTERNAL,
          COMM           POSITION (41:48)    DECIMAL EXTERNAL,
          DEPTNO         POSITION (50:51)    INTEGER EXTERNAL,
          HIREDATE       POSITION (52:60)    INTEGER EXTERNAL)

    Комментарии:
    1     Указание имени файла отсеянных записей (CASE4.DIS).
    2     Указание верхнего ограничения на количество отсеиваемых
          записей (999).
    3     Указание утилите SQL*Loader  на то,  что если в таблице
          уже есть  данные,   перед  загрузкой  новых записей они
          должны быть удалены.
    4     Если  в  первой позиции  текущей записи стоит звездочка
          (*), это означает,   что  следующая  физическая  запись
          должна быть  добавлена к текущей при формировании одной
          логической записи.  Обратите внимание на то, что первая
          позиция каждой  физической записи должна содержать либо
          звездочку, либо незначащий символ.

    Ниже приводится  содержимое файла данных CASE4.DAT.  Обратите
внимание на звездочку в первой позиции каждой записи и на  внешне
незаметный признак перехода на новую строку, присутствующий в 20-
й позиции записи (после символов "MA",  "PR" и т.д.).  Начисления
на служащего CLARK имеют значение "-10" и утилита SQL*Loader заг-
ружает это значение, преобразуя его в отрицательное число.

    Последние две  записи будут отвергнуты в случае принятия сле-
дующих допущений.  Если со столбцом EMPNO связан  уникальный  ин-
декс, запись    о  служащем  CHIN будет отвергнута,  ибо значение
столбца EMPNO в этой записи  совпадает  со  значением  указанного



                                    -- 54 --



столбца в   записи о служащем CHAN.  Если столбец EMPNO определен
как NOT NULL,  запись о служащем CHEN будет отвергнута из-за  от-
сутствия значения для данного столбца.

    *7782 CLARK      MA
     NAGER   7839  2572.50   -10    2512-NOV-85
    *7839 KING       PR
     ESIDENT       5500.00          2505-APR-83
    *7934 MILLER     CL
     ERK     7782   920.00          2508-MAY-80
    *7566 JONES      MA
     NAGER   7839  3123.75          2517-JUL-85
    *7499 ALLEN      SA
     LESMAN  7698  1600.00   300.00 25 3-JUN-84
    *7654 MARTIN     SA
     LESMAN  7698  1312.50  1400.00 2521-DEC-85
    *7658 CHAN       AN
     ALYST   7566  3450.00          2516-FEB-84
    *     CHEN       AN
     ALYST   7566  3450.00          2516-FEB-84
    *7658 CHIN       AN
     ALYST   7566  3450.00          2516-FEB-84

    Регистрационный файл имеет следующий вид.

    Control File:         case4.ctl
    Data File:            case4.dat
    Read Mode:            System Record
    Bad File:             case4.bad
    Discard File:         case4.dsc (Allow 999 discards)

    Number to load:       ALL
    Number to skip:       0
    Errors allowed:       50
    Bind array:           64 rows, maximum of 65336 bytes
    Record Length:        80 (Buffer size allocated per logical
                          record)
    Continuation:         1:1 = '*', in current physical record.

    Table EMP, loaded from every logical record.
    Insert option in effect for this table: REPLACE

    Column Name    Position    Len    Term    Encl    Datatype
    -----------    --------    ---    ----    ----    ---------
    EMPNO            1:4         4                    CHARACTER
    ENAME            6:15       10                    CHARACTER
    JOB             17:25        9                    CHARACTER
    MGR             27:30        4                    CHARACTER
    SAL             32:39        8                    CHARACTER
    COMM            41:48        8                    CHARACTER
    DEPTNO          50:51        2                    CHARACTER
    HIREDATE        52:60        9                    CHARACTER

    Rejected logical records and errors:

    Data File case4.dat -



                                    -- 55 --



    Record 8: Rejected - Error on table EMP, column EMPNO.
    ORA-01400: mandatory (NOT NULL)  column is  missing  or  NULL
    during insert
    Record 9: Rejected - Error on table EMP.
    ORA-00001: duplicate key in index

    продолжение следует ...

    Table EMP:
          7 Rows successfully loaded.
          2 Rows not loaded due to data errors.
          0 Rows not loaded because all WHEN clauses were failed.
          0 Rows not loaded because all fields were null.

    Space allocated for bind array:    4480 bytes (64 rows)
    Space otherwise allocated:         6740 bytes

    Total logical records skipped:           0
    Total logical records read:              9
    Total logical records rejected:          2
    Total logical records discarded:         0

    Ниже приводится файл плохих записей, состоящий из записей 8 и
9. (Файл отсеянных записей пуст.)

    *     CHEN       AN
     ALYST   7566  3450.00          2516-FEB-84
    *7658 CHIN       AN
     ALYST   7566  3450.00          2516-FEB-84


    Пример 5: Загрузка данных в несколько таблиц
    --------------------------------------------

    Пример 5 демонстрирует следующее:
    * загрузку двух таблиц (EMP и PROJ)
    * использование утилиты SQL*Loader для разбиения повторяющих-
      ся групп и загрузки данных в нормализованные таблицы.   (Из
      одной записи файла может получиться несколько строк БД.)
    * получение нескольких логических записей из каждой  физической
    * загрузку одного и того же поля в несколько таблиц
    * использование предложения WHEN
    Номера слева в приводимом ниже листинге содержимого управляю-
щего файла  в самом файле отсутствуют; они используются в коммен-
тариях к файлу, следующих дальше. При создании управляющего файла
эти номера не вводятся.

          -- Loads EMP records from first 23 characters
          -- Creates and loads PROJ records for each PROJNO
          -- listed for each employee

          LOAD DATA
          INFILE CASE5.DAT
          BADFILE CASE5.BAD
          DISCARDFILE CASE5.DSC
    1     REPLACE



                                    -- 56 --



    2     INTO TABLE EMP
          (EMPNO  POSITION (1:4)    INTEGER EXTERNAL,
          ENAME   POSITION (6:15)   CHAR,
          DEPTNO  POSITION (17:18)  CHAR,
          MGR     POSITION (20:23)  INTEGER EXTERNAL)

    2     INTO TABLE PROJ
          -- PROJ has two columns, both not null: EMPNO and
          -- PROJNO
    3     WHEN PROJNO != '   '
          (EMPNO  POSITION (1:4)    INTEGER EXTERNAL,
    3     PROJNO  POSITION (25:27)  INTEGER EXTERNAL) -- 1st proj
    продолжение следует ...

    2     INTO TABLE PROJ
    4     WHEN PROJNO != '   '
          (EMPNO  POSITION (1:4)    INTEGER EXTERNAL,
    4     PROJNO  POSITION (29:31)  INTEGER EXTERNAL) -- 2nd proj

    2     INTO TABLE PROJ
    5     WHEN PROJNO != '   '
          (EMPNO  POSITION (1:4)    INTEGER EXTERNAL,
    5     PROJNO  POSITION (33:35)  INTEGER EXTERNAL) -- 3rd proj

    Комментарии:
    1     Указание на то, что если в таблицах (EMP и PROJ), в ко-
          торые предполагается загружать данные,   уже  есть  ка-
          кая-то информация, ее следует удалить.
    2     При загрузке двух таблиц, EMP и PROJ, используются  не-
          сколько предложений INTO. При загрузке данных в таблицу
          PROJ один и тот же набор записей фактически обрабатыва-
          ется трижды с использованием различных комбинаций обра-
          батываемых столбцов.
    3     Использование предложения WHEN для загрузки только  тех
          строк, которые содержат непустое значение номера проек-
          та (projno).  Если номер проекта находится в позициях с
          25-й по 27-ю, строки включаются в таблицу PROJ только в
          том случае,  если в этих позициях имеются значащие символы.
    4     Если номер проекта находится в позициях с 29-й по 31-ю,
          строки включаются в таблицу PROJ только в  том  случае,
          если в этих позициях имеются значащие символы.
    5     Если номер проекта находится в позициях с 33-й по 35-ю,
          строки включаются в таблицу PROJ только в  том  случае,
          если в этих позициях имеются значащие символы.
    Файл данных в примере 5 имеет следующий вид:

    1234 BAKER      10 9999 101 102 103
    1234 JOKER      10 9999 777 888 999
    2664 YOUNG      20 2893 425 abc 102
    5321 OTOOLE     10 9999 321  55  40
    2134 FARMER     20 4555 236 456
    2414 LITTLE     20 5634 236 456  40
    6542 LEE        10 4532 102 321  14
    2849 EDDS       xx 4555     294  40
    4532 PERKINS    10 9999  40
    1244 HUNT       11 3452 665 133 456
    123  DOOLITTLE  12 9940         132
    1453 MACDONALD  25 5532     200

                                    -- 57 --



Регистрационный файл в данном примере имеет следующий вид:

    Control File:         case5.ctl
    Data File:            CASE5.DAT
    Read Mode:            System Record
    Bad File:             CASE5.BAD
    Discard File:         CASE5.DSC (Allow all discards)

    Number to load:       ALL
    Number to skip:       0
    Errors allowed:       50
    Bind array:           64 rows, maximum of 65336 bytes
    Record Length:        80 (Buffer size allocated per logical record)
    Continuation:         none specified

    Table EMP, loaded from every logical record.
    Insert option in effect for this table: REPLACE

    Column Name    Position    Len    Term    Encl    Datatype
    -----------    --------    ---    ----    ----    ---------
    EMPNO            1:4         4                    CHARACTER
    ENAME            6:15       10                    CHARACTER
    DEPTNO          17:18        2                    CHARACTER
    MGR             20:23        4                    CHARACTER

    Table PROJ, loaded when PROJNO != '   '
    Insert option in effect for this table: REPLACE

    Column Name    Position    Len    Term    Encl    Datatype
    -----------    --------    ---    ----    ----    ---------
    EMPNO            1:4         4                    CHARACTER
    PROJNO          25:27        3                    CHARACTER

    Table PROJ, loaded when PROJNO != '   '
    Insert option in effect for this table: REPLACE

    Column Name    Position    Len    Term    Encl    Datatype
    -----------    --------    ---    ----    ----    ---------
    EMPNO            1:4         4                    CHARACTER
    PROJNO          29:31        3                    CHARACTER

    продолжение следует ...

    Table PROJ, loaded when PROJNO != '   '
    Insert option in effect for this table: REPLACE

    Column Name    Position    Len    Term    Encl    Datatype
    -----------    --------    ---    ----    ----    ---------
    EMPNO            1:4         4                    CHARACTER
    PROJNO          33:35        3                    CHARACTER

          Rejected records and errors:

          Data File CASE5.DAT -

    1     Record 2: Rejected - Error on table EMP.
    1        ORA-00001: duplicate key in index
    1     Record 8: Rejected - Error on table EMP, column DEPTNO.

                                    -- 58 --



    1        ORA-01722: invalid number
    1     Record 3: Rejected - Error on table PROJ, column PROJNO.
    1        ORA-01722: invalid number

          Table EMP:
    2        9 Rows successfully loaded.
    2        3 Rows not loaded due to data errors.
    2        0 Rows not loaded because all WHEN clauses were
               failed.
    2        0 Rows not loaded because all fields were null.

          Table PROJ:
    3        7 Rows successfully loaded.
    3        2 Rows not loaded due to data errors.
    3        3 Rows not loaded because all WHEN clauses were
               failed.
    3        0 Rows not loaded because all fields were null.

          Table PROJ:
    4        7 Rows successfully loaded.
    4        3 Rows not loaded due to data errors.
    4        2 Rows not loaded because all WHEN clauses were
               failed.
    4        0 Rows not loaded because all fields were null.

          Table PROJ:
    5        6 Rows successfully loaded.
    5        3 Rows not loaded due to data errors.
    5        3 Rows not loaded because all WHEN clauses were
               failed.
    5        0 Rows not loaded because all fields were null.

    продолжение следует ...

    Space allocated for bind array:    3904 bytes (64 rows)
    Space otherwise allocated:         7568 bytes

    Total logical records skipped:           0
    Total logical records read:             12
    Total logical records rejected:          3
    Total logical records discarded:         0

    Комментарии:
    1     Как результат буферной обработки записей, ошибки возни-
          кают не в той последовательности,  в которой физические
          записи располагаются в файле данных. Соответственно и в
          файлы плохих  и  отсеянных записей эти ошибочные строки
          попадают в том же порядке,  в котором они появляются  в
          регистрационном файле.
    2     3 из 12 записей  оказались  отвергнутыми  (для служащих
          JOKER, YOUNG и EDDS). Данные, содержащиеся в этих запи-
          сях, в базу не попали.
    3     Критерию,  указанному в предложении WHEN, удовлетворяют
          девять записей,  две записи (о служащих JOKER и  YOUNG)
          отвергнуты из-за ошибок в данных.
    4     Критерию,  указанному в предложении WHEN, удовлетворяют
          десять записей,  три записи (о служащих JOKER,  YOUNG и
          EDDS) отвергнуты из-за ошибок в данных.

                                    -- 59 --



    5     Критерию,  указанному в предложении WHEN, удовлетворяют
          девять записей,  три записи (о служащих JOKER,  YOUNG и
          EDDS) отвергнуты из-за ошибок в данных.

    Результаты работы утилиты:

    SQL> select empno, ename, mgr, deptno from emp;

    EMPNO     ENAME           MGR           DEPTNO
    1234      BAKER           9999             10
    5321      OTOOLE          9999             10
    2134      FARMER          4555             20
    2414      LITTLE          5634             20
    6542      LEE             4532             10
    4532      PERKINS         9999             10
    1244      HUNT            3452             11
    123       DOOLITTLE       9940             12
    1453      MACDONALD       5532             25

    SQL> select * from proj order by empno;
               EMPNO          PROJNO
                  123          132
                 1234          101
                 1234          103
                 1234          102
                 1244          665
                 1244          456
                 1244          133
                 1453          200
                 2134          236
                 2134          456
                 2414          236
                 2414          456
                 2414           40
                 4532           40
                 5321          321
                 5321           40
                 5321           55
                 6542          102
                 6542           14
                 6542          321


















                                    -- 60 --



    ГЛАВА 6  СИНТАКСИС КОМАНДНОЙ СТРОКИ
    ---------------------------------ДД

    В данной  главе  рассматривается  запуск утилиты SQL*Loader с
помощью команды SQLLOAD и различные аргументы  этой  команды.   В
числе прочих обсуждаются следующие вопросы:
    * команда SQLLOAD
    * синтаксис командной строки
    * аргументы командной строки
    * параметр OPTIONS
    * сообщения утилиты SQL*Loader

    Команда SQLLOAD
    ---------------
    Утилита SQL*Loader   запускается   на   выполнение   командой
SQLLOAD, имеющей различные аргументы. Если Вы используете команду
SQLLOAD без аргументов,  на экран будет выдан список аргументов с
их кратким описанием и значениями по  умолчанию.   (Некоторые  из
умолчаний зависят от типа операционной системы, поэтому Вам лучше
всего обратиться к умолчаниям, принятым в Вашей операционной сис-
теме.) В приведенном ниже примере показаны умолчания,  не завися-
щие от типа операционной системы.

SQLLOAD
Usage: SQLLOAD keyword=value [,keyword=value,...]

Valid Keywords:

    userid -- ORACLE username/password
   control -- Control file name
       log -- Log file name
       bad -- Bad file name
      data -- Data file name
   discard -- Discard file name
discardmax -- Number of discards to allow        (Default all)
      skip -- Number of logical records to skip  (Default 0)
      load -- Number of logical records to load  (Default all)
    errors -- Number of errors to allow          (Default 50)
      rows -- Number of rows in bind array       (Default 64)
  bindsize -- Size of bind array in bytes        (Default nnnnn)
    silent -- Suppress messages during run (header, feedback, errors, discards)

    После самой команды идет перечисление ее аргументов,  которые
могут разделяться между собой запятыми. Аргументы можно указывать
двумя способами:
    * в произвольном порядке, с использованием ключевых слов
    * в заранее установленном порядке, без ключевых слов
    Так, например,  две следующие командные строки являются экви-
валентными:

    SQLLOAD CONTROL=foo.ctl,LOG=bar.log,BAD=baz.bad,DATA=etc.dat,
    USERID=scott/tiger,ERRORS=999,LOAD=2000,DISCARD=toss.dis,
    DISCARDMAX=5

    SQLLOAD scott/tiger, foo.ctl, bar.log, baz.bad, etc.dat,
    toss.dis, 5, 0, 2000, 999



                                    -- 61 --



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

    SQLLOAD jane/pride, jobctl.ctl, DISCARD=jobctl.dis, SKIP=1000
а такая нет:

    SQLLOAD SKIP=1000, jane/pride, jobctl.ctl, DISCARD=jobctl.dis

    Аргументы командной строки
    --------------------------

    Описание аргументов командной строки SQL*Loader:

Ключевое слово    Значение                 Положение в строке
---------------------------------------------------------------ДД
USERID            Идентификация пользователя         1
    В этом аргументе указывается имя пользователя БД  и  его  па-
роль. Если аргумент опущен,  утилита запросит его значение.  Если
указан только символ наклонной черты,  по умолчанию будут приняты
имя и пароль,  с которыми пользователь зарегистрировался в систе-
ме. Для загрузки данных в удаленную базу можно использовать  спе-
цификацию БД, принятую в SQL*Net.

CONTROL           Управляющий файл                   2
    В этом аргументе указывается имя управляющего файла, описыва-
ющего условия  загрузки данных.  Если расширение имени файла (тип
файла) не указано,  по умолчанию принимается расширение CTL. Если
аргумент опущен, утилита запросит его значение.


LOG               Регистрационный файл               3
    В этом аргументе указывается имя регистрационного файла,  ко-
торый будет создан утилитой для сохранения информации о ходе заг-
рузки. Если имя файла не указано,  по умолчанию  будет  использо-
ваться имя  управляющего файла.  Если расширение имени файла (тип
файла) не указано, по умолчанию принимается расширение LOG.

BAD               Файл плохих записей                4
    В этом аргументе указывается имя файла плохих записей, созда-
ваемого утилитой для запоминания тех записей,  при загрузке кото-
рых обнаруживаются   ошибки,   или  тех,   которые имеют неверный
формат. Если  имя файла не указано,  по умолчанию будет использо-
ваться имя  управляющего файла.  Если расширение имени файла (тип
файла) не  указано, по умолчанию принимается расширение BAD. Фор-
мат этого файла совпадает с форматом файла данных,  поэтому после
редактирования и внесения всех необходимых изменений  отвергнутые
ранее данные  могут быть загружены вновь с использованием того же
самого управляющего файла.

DATA              Файл данных                        5
    В этом аргументе указывается имя файла, который содержит заг-
ружаемые данные.  Если имя файла не указано,  по умолчанию  будет
использоваться имя управляющего файла. Если расширение имени фай-
ла (тип файла)  не указано,  по умолчанию принимается  расширение
DAT. Данные могут располагаться и в управляющем файле.



                                    -- 62 --



Ключевое слово    Значение                 Положение в строке
---------------------------------------------------------------ДД
DISCARD           Файл отсеянных записей             6
    В этом  аргументе указывается имя необязательного файла отсе-
янных записей, создаваемого утилитой для запоминания тех записей,
которые не попадают ни в базу, ни в файл плохих записей. Если имя
файла не указано, по умолчанию будет использоваться имя управляю-
щего файла.  Если расширение имени файла (тип файла)  не указано,
по умолчанию принимается расширение DSC.  Формат этого файла сов-
падает с   форматом файла данных,  поэтому после редактирования и
внесения всех необходимых изменений отсеянные ранее данные  могут
быть загружены вновь с использованием того же самого управляющего
файла.

DISCARDMAX        Максимальное число отсеиваемых     7
                  записей
    В этом аргументе указывается максимальное число записей,  от-
сев которых не приводит к завершению работы утилиты. По умолчанию
количество отсеиваемых записей не ограничивается. Для того, чтобы
остановиться при первом обнаружении подобной записи, следует ука-
зать нулевое значение.

SKIP              Количество пропускаемых записей    8
    В этом  аргументе  указывается количество логических записей,
пропускаемых при загрузке с начала файла данных.  По умолчанию ни
одной записи не пропускается.

LOAD              Количество загружаемых записей     9
    В этом аргументе указывается максимальное количество логичес-
ких записей, которое должно быть загружено в данном сеансе (после
пропуска записей,  количество которых указано в предыдущем  аргу-
менте). По  умолчанию  загрузке  подлежат все записи.  Если будет
загружено меньшее количество записей,  чем указано  в  аргументе,
ошибки не произойдет.

ERRORS            Допустимое количество ошибок       10
    В этом аргументе указывается максимально-допустимое количест-
во ошибок,  возникновение которых не приводит к завершению работы
утилиты. По умолчанию допускается не более 50 ошибок.  Для  того,
чтобы прекратить работу при возникновении первой же ошибки, в ка-
честве значения аргумента следует указать  0.   Чтобы  обработать
весь файл данных,  невзирая на содержащееся в нем количество оши-
бок, в качестве значения аргумента следует использовать какое-ни-
будь очень большое число.

Ключевое слово    Значение                 Положение в строке
---------------------------------------------------------------ДД
ROWS              Число строк в связанном массиве    11
    В этом  аргументе указывается количество строк,  одновременно
помещаемых в буфер перед выполнением вставки данных и регистраци-
ей изменений в БД. Значение по умолчанию равно 64.

BINDSIZE          Максимальный размер связанного     12
                  массива в байтах
    В этом  аргументе  указывается максимальный размер связанного
массива в байтах. Значение аргумента отменяет умолчание на размер
массива (зависящее от типа системы)  и то значение, которое может
быть вычислено на основе предыдущего аргумента.

                                    -- 63 --



SILENT            Режим обратной связи               13
    Значениями этого аргумента могут быть следующие ключевые сло-
ва, которые используются для подавления:

HEADER            Заголовка утилиты SQL*Loader
FEEDBACK          Каждого  сообщения о достижении точки регистра-
                  ции изменений в базе
ERRORS            Включения в регистрационный файл каждой записи,
                  при загрузке которой имела место ошибка  ORACLE
                  (при этом  сообщение  о  количестве отвергнутых
                  записей остается)
DISCARDS          Включения в регистрационный файл каждой записи,
                  помещенной в файл отсеянных записей
ALL               Всего вышеперечисленного

    Использование ключевого слова OPTIONS
    -------------------------------------

    Использование ключевого слова OPTIONS имеет смысл в том  слу-
чае, если Вы многократно загружаете данные с одним и тем же набо-
ром опций, чрезвычайно удлиняющим командную строку, и имеет целью
экономию времени при вызове утилиты SQL*Loader.
    Ключевое слово OPTIONS позволяет указывать некоторые аргумен-
ты не в командной строке, а в управляющем файле. К таким аргумен-
там относятся:
    SKIP = n
    LOAD = n
    ERRORS = n
    ROWS = n
    BINDSIZE = n
    SILENT = {HEADER і FEEDBACK і ERROR і DISCARDS і ALL}
    Пример:
    OPTIONS (BINDSIZE=100000, SILENT=FEEDBACK)
    Значения аргументов,  указанные в управляющем файле с помощью
ключевого слова OPTIONS,  отменяют соответствующие значения, ука-
занные в командной строке.

    Сообщения, возвращаемые утилитой SQL*Loader
    -------------------------------------------

    Во время работы утилита SQL*Loader выдает  различные  сообще-
ния, например:
SQL*Loader: Version 1.0 - Production on Wed Feb 24 15:07:23 1988
Copyright (c) Oracle Corporation 1979, 1988. All rights reserved

Commit point reached - logical record count 20

    Могут иметь место и сообщения об ошибках, например:
SQL*Loader: Version 1.0 - Production on Wed Feb 24 15:07:23 1988
Copyright (c) Oracle Corporation 1979, 1988. All rights reserved

SQL*Loader-641: Non-recoverable ORACLE error occurred
ORA-00904: invalid column name
Error occurred on SQL insert statement for table EMP
Your use of column LOADSEQ is possibly in error




                                    -- 64 --



    Сообщения об ошибках также включаются в регистрационный файл.
Более подробно об этих сообщениях см. в Приложении B.
    Вывод заголовка утилиты и обратную связь можно подавить,  ис-
пользуя в командной строке опцию SILENT:
    SILENT=(HEADER, FEEDBACK)

    ГЛАВА 7  СИНТАКСИС УПРАВЛЯЮЩЕГО ФАЙЛА
    ------------------------------------Д
    В данной   главе   рассматривается   язык   загрузки   данных
SQL*Loader, используемый при написании управляющих файлов. Приме-
ры управляющих  файлов  см.  в главе 5.  Среди прочих обсуждаются
следующие вопросы:
    * создание управляющего файла
    * синтаксис оператора LOAD DATA
    * описание файлов данных
    * описание таблиц и столбцов
    * указание начала загружаемых данных

    Создание управляющего файла
    ---------------------------
    Управляющий файл содержит в себе информацию:
    * о  местонахождении загружаемых данных,  идентифицируя файлы
      данных с помощью ключевого слова INFILE или отмечая  начало
      загружаемых данных в самом управляющем файле с помощью клю-
      чевого слова BEGINDATA.  Если ни одно из указанных ключевых
      слов не используется, предполагается, что данные расположе-
      ны в файле, имя которого содержится в командной строке.
    * о базовых таблицах,  в которые будет производиться загрузка
      данных (начало этой информации отмечается  ключевым  словом INTO TABLE)
    * о соответствии полей файла данных столбцам  базовых  таблиц
      (эта информация описывается с помощью оператора LOAD DATA)
    Основные правила написания управляющего файла:
    * Файл пишется в "свободном формате".  Другими словами, пред-
      ложения, составляющие его,  могут переходить с одной строки
      на другую, разрываясь в любом месте.
    * При написании файла могут использоваться как заглавные, так
      и строчные буквы. Размер букв не имеет значения, если толь-
      ко строка не заключена в кавычки.
    * Начало  комментариев в тексте отмечается двойным тире.  Эта
      последовательность символов может появляться в любом  месте
      строки; всю  оставшуюся  после  нее  часть  строки  утилита
      SQL*Loader будет игнорировать.  Комментарии не должны появ-
      ляться внутри  самих данных (в файле данных или в управляю-
      щем файле); если двойное тире появится внутри данных,   оно
      будет истолковано как элемент данных.
    * Если в качестве имен таблиц или столбцов  Вы  намереваетесь
      использовать слова,  зарезервированные утилитой SQL*Loader,
      Вам при этом следует заключать их в кавычки.  (Полный пере-
      чень слов, зарезервированных для использования утилитой SQL
      *Loader, приводится в Приложении D.)

    Синтаксис оператора LOAD DATA
    -----------------------------

    Управляющий файл обычно открывается фразой LOAD DATA,  за ко-
торой следует несколько фраз, характеризующих загружаемые данные.
(Раньше фразы  LOAD DATA может располагаться только фраза OPTIONS
или комментарии.)

                                    -- 65 --



    Полный синтаксис оператора LOAD DATA:

OPTIONS (параметры)

LOAD [DATA]
[{INFILEіINDDN} {имя_файлаі * }
 {STREAMіRECORDіFIXED длина [BLOCKSIZE размер]іVARIABLE [длина] ]
[{BADFILEіBADDN} имя_файла ]
[{DISCARDFILEіDISCARDDN} имя_файла ]
[{DISCARDSіDISCARDMAX} n ]

[{INDDNіINFILE} ...]

[APPENDіREPLACEіINSERT]
[RECLEN n ]
[{CONCATENATE n іCONTINUEIF {[THISіNEXT] (начало[:конец]) і
  LAST} операция {'символьная_строка'іX'шестнадцатиричная_строка'}}]
INTO TABLE имя_таблицы
  [APPENDіREPLACEіINSERT]
  [WHEN состояние_поля [AND состояние_поля ...]]
  [FIELDS [спецификация_ограничителя]]
  (
    имя_столбца
    {
      RECNUM і
      CONSTANT значение і
      SEQUENCE ({ n і MAX і COUNT} [, приращение]) і
      [POSITION ({начало[:конец]і * [+n] })] описание_типа_данных
       [NULLIF состояние_поля]
       [DEFAULTIF состояние_поля]
    }
    [ ,... ]
  )
[INTO TABLE ... ]

[BEGINDATA]

    Элементы синтаксиса

    Операции
    Разрешены операции, связанные с равенством или неравенством:
    =    !=    ї=    <>

    Параметры
    Разрешается задание следующих параметров:
    LOAD  SKIP  ERRORS  ROWS  BINDSIZE  SILENT
    Эти параметры могут использоваться в любой комбинации. Формат
задания параметров следующий:
    OPTIONS ( ROWS=200  SILENT= (HEADER,FEEDBACK) )
    Обратите внимание  на то,  что указание в фразе OPTIONS пара-
метра SILENT=HEADER не будет иметь желаемого результата; к  этому
моменту заголовок  утилиты  уже будет выведен на экран.  Указание
подавления заголовка следует производить в командной строке.

    Состояние_поля
    Состояние поля указывается следующим образом:
    { ( начало [:конец ] ) і имя_столбца } операция


                                    -- 66 --



        {'символьная_строка' і X'шестнадцатиричная_строка' }
    Примечание: 'символьная_строка' и  'шестнадцатиричная_строка'
могут быть заключены либо в одинарные, либо в двойные кавычки.

    Описание_типа_данных
Тип данных описывается с помощью одного из следующих ключевых  слов:
    CHAR [ ( длина ) ] [ спецификация_ограничителя ]
    DATE [ ( длина ) ] [ маска ] [ спецификация_ограничителя ]
    VARCHAR [ ( длина ) ]
    SMALLINT
    DOUBLE
    GRAPHIC [EXTERNAL] [ (длина) ]
    {INTEGER і FLOAT і DECIMAL} EXTERNAL [ ( длина ) ]
    INTEGER [ ( длина ) ]
    FLOAT [ ( длина ) ]
    DECIMAL ( разрядность [,точность] )
    VARGRAPHIC [ ( длина ) ]

    Спецификация_ограничителя
    Ограничитель данных описывается следующим образом:
    [ TERMINATED [ BY ] { WHITESPACE і [X] 'символ' } ]
        [ [ OPTIONALLY ] ENCLOSED [ BY ] [X] 'символ' ]
    Примечание: Значение переменной 'символ' может заключаться  в
одинарные или  двойные  кавычки.  Если используется формат X'сим-
вол', значение этой переменной интерпретируется  как  код  симво-
ла-ограничителя в стандарте ASCII,  указанный в шестнадцатиричном
формате. Ключевое слово TERMINATED должно идти  прежде  ключевого
слова ENCLOSED.

    Описание файлов данных
    ----------------------
    Чтобы полностью описать файл данных, укажите имя файла (в со-
ответствующем операторе)   и  в случае необходимости режим чтения
файла. С помощью нескольких предложений INFILE Вы можете  описать
несколько файлов.

    Имя файла

    Файл, содержащий загружаемые данные,  описывается  с  помощью
ключевых слов  INFILE  или  INDDN,  после которых указывается имя
файла и режим чтения.  Имя файла,  указанное в этих предложениях,
заменяет собой  то имя,  которое было указано в командной строке.
Если имя файла не указано,  по умолчанию в качестве  имени  файла
данных используется имя управляющего файла с расширением DAT. Ес-
ли же данные содержатся в самом управляющем файле,  вместо  имени
файла следует указать "*".
    { INFILE і INDDN }   { имя_файла і * }
где:

INFILE или      Может использоваться любое из этих ключевых слов.
INDDN

имя_файла       Имя файла, содержащего загружаемые данные.  Может
                указываться любое имя,  допустимое в Вашей опера-
                ционной системе. Оно может быть заключено в двой-
                ные кавычки.  Если имя файла содержит пробелы или
                знаки пунктуации (двоеточие,  например), его обя-


                                    -- 67 --



                зательно нужно заключить в двойные кавычки.  Если
                оно уже содержит двойные кавычки, можно использо-
                вать одинарные.

*               Используется вместо имени файла для указания  то-
                го, что данные содержатся в управляющем файле.

    Режим чтения файла

    Дополнительно может указываться режим чтения файла.  Этот ре-
жим определяет порядок открытия файла данных и выборки физических
записей. Некоторые из режимов  повышают  гибкость  взаимодействия
СУРБД ORACLE с различными операционными системами.

STREAM і RECORD і FIXED длина [BLOCKSIZE размер] VARIABLE [длина]
где:

STREAM          Файл данных трактуется как последовательный поток
                байтов. Символы считываются по одному. Физические
                записи разделяются  признаками  перехода на новую строку.

RECORD          Значение по умолчанию. Означает, что утилита SQL*
                Loader должна  использовать режим,  принятый под-
                системой управления файлами,  входящей  в  состав
                Вашей операционной системы. Режим RECORD является
                единственным режимом,  допускающим  использование
                "*" вместо имени файла.  Таким образом, если дан-
                ные находятся в управляющем файле,  режим  чтения
                файла можно не указывать.

FIXED длина     Логические  записи имеют фиксированную длину. Но-
                вая запись образуется в результате чтения из фай-
                ла очередной  последовательности байтов указанной
                длины. Обратите внимание на то,  что FIXED  имеет
                отношение к формату физической записи; поля запи-
                си могут иметь свободный формат. Если данные заг-
                ружаются непосредственно с ленты, можно указывать
                размер блока (BLOCKSIZE).

VARIABLE        Длина записи содержится в первых двух байтах. За-
[длина]         пись читается следующим образом: сначала считыва-
                ется длина,  затем указанное в длине число  байт.
                Первые два байта, содержащие длину, не рассматри-
                ваются как часть самой записи.  Значение, указан-
                ное в параметре VARIABLE, определяет максимально-
                допустимую длину,  используемую в целях оптимиза-
                ции буферной обработки. Если никакого значения не
                указано, для каждой  записи  выделяется  8  Кбайт
                (этот размер может превышать ресурсы памяти, име-
                ющиеся в Вашей системе).

Примечание: Не  все  из перечисленных выше режимов поддерживаются
в любых  системах.  К тому же если в системе отсутствуют средства
управления записями, режим RECORD совпадает с режимом STREAM.

    Описание нескольких файлов данных



                                    -- 68 --



    В случае  загрузки  данных  из нескольких файлов сразу каждый
файл описывается отдельным оператором INFILE.  Режим  чтения  для
каждого файла может быть свой: для одного - STREAM, для другого -
FIXED, а третий файл, содержащий данные, может быть вообще управляющим.

    С каждым файлом данных Вы также можете связать еще два файла:
файл отсеянных  записей и файл плохих записей.  Имена этих файлов
приводятся после имени файла данных. В следующем фрагменте управ-
ляющего файла содержится описание четырех файлов данных:

    INFILE mydat1.dat  BADFILE mydat1.bad  DISCARDFILE mydat1.dis
    INFILE mydat2.dat
    INFILE mydat3.dat  DISCARDFILE mydat3.dis
    INFILE mydat4.dat  DISCARDMAX 10

    Поскольку для первого файла данных (MYDAT1.DAT)  файлы плохих
и отсеянных  записей указаны явно,  оба файла будут созданы.  Для
второго файла данных (MYDAT2.DAT) ни тот, ни другой файлы явно не
указаны, поэтому будет создан только файл плохих записей с именем
и расширением, выбранными по умолчанию. В третьем случае оба фай-
ла будут созданы:  файл отсеянных записей,  как указанный явно, и
файл плохих записей - по умолчанию.
    В четвертом случае (файл данных MYDAT4.DAT) будет создан файл
плохих записей со спецификацией по умолчанию и,  поскольку указан
параметр DISCARDMAX,   утилита SQL*Loader предполагает,  что файл
отсеянных записей тоже нужен и создает его с именем по  умолчанию
(MYDAT4.DSC).

    Примеры описания файла данных

В первом примере укажем,  что данные находятся в самом управляющем файле:

    INFILE *

    В следующем примере укажем,  что данные находятся в  файле  с
именем WHIRL, имеющем расширение по умолчанию (DAT):

    INFILE WHIRL

    Теперь укажем,   что  данные  располагаются  в файле с именем
TEST3.DAT в потоковом формате:

    INFILE TEST3.DAT  STREAM

    В следующем примере укажем,  что данные находятся в  файле  с
именем JULYREV.MJB, состоящем из записей фиксированной длины:

    INFILE "JULYREV.MJB"

    И наконец,  попробуем указать, что данные находятся в ленточ-
ном файле с именем DAT0787.DAT,  состоящем из записей фиксирован-
ной длины, объединенных в блоки размером 1 Кбайт:

    INDDN "DAT0787.DAT"  FIXED 80  BLOCKSIZE 1024

    Описание файла плохих записей
    -----------------------------
    Во время своей работы утилита SQL*Loader создает файл,  в ко-

                                    -- 69 --



торый помещает записи, имеющие ошибки форматирования или вызываю-
щие ошибки в работе СУРБД ORACLE.  Для задания имени этого  файла
может использоваться  ключевое слово BADFILE или BADDN.  Если имя
не указано,  файлу присваивается имя файла  данных  и  расширение
BAD. Указание  имени файла плохих записей в управляющем файле от-
меняет аналогичное указание, сделанное ранее в командной строке.

    Режим чтения,  формат записи и самого  файла  плохих  записей
совпадает с режимом чтения и аналогичными форматами файла данных.
Если файл плохих записей с указанным именем уже существует, в за-
висимости от типа операционной системы он либо переписывается за-
ново, либо создается его новая версия.

    [BADFILE і BADDN] спецификация_файла
где:

BADFILE или     Может использоваться любое из этих ключевых слов.
BADDN

спецификация_   Любое допустимое имя файла, предназначенного  для
файла           сохранения отвергнутых записей.

    Файл плохих записей создается всегда,  даже если ни  одна  из
записей не будет отвергнута.

    Примеры описания файла плохих записей

    В первом  примере  укажем,  что файл плохих записей имеет имя
UGH и расширение по умолчанию (BAD):

    BADFILE UGH

    В следующем примере укажем, что файл плохих записей имеет имя
BAD0001 и расширение REJ:

    BADDN BAD0001.REJ

    Описание файла отсеянных записей
    --------------------------------
    Во время своей работы утилита SQL*Loader может создать  файл,
в который будет помещать записи,  не удовлетворяющие ни одному из
условий фильтрации.  Это т.н.  отсеянные записи, не совпадающие с
отвергнутыми.
    Наличие какой-либо неверной информации в такого рода  записях
совсем не обязательно.  Просто эти записи не удовлетворяют набору
критериев, налагаемых предложениями WHEN на  загружаемые  данные.
Если запись все-таки попадает в одну из таблиц (или же включается
в число отвергнутых из-за ошибки в данных),  она не считается отсеянной.
    Файл отсеянных записей создается по Вашему желанию.
    Для того,  чтобы создать файл отсеянных записей,  используйте
один из следующих параметров:
    В управляющем файле                В командной строке
    ------------------------------------------------------Д
    DISCARDFILE имя_файла              DISCARD
    DISCARDDN имя_файла                DISCARDMAX
    DISCARDS
    DISCARDMAX


                                    -- 70 --



    Обратите внимание на то,  что Вы можете потребовать  создания
файла отсеянных записей явно,  указав его имя, или неявно, указав
максимально-допустимое число отсеиваемых записей.
    Чтобы указать  имя  файла,  используйте параметры DISCARDFILE
или DISCARDDN:

    [DISCARDFILE і DISCARDDN] спецификация_файла
где:

DISCARDFILE     Может использоваться любое из этих ключевых слов.
или DISCARDDN

спецификация_   Любое допустимое имя файла, предназначенного  для
файла           сохранения отсеянных записей.

    Имя файла отсеянных записей по умолчанию совпадает  с  именем
файла данных, расширение имени файла по умолчанию - DSC. Указание
имени файла отсеянных записей в управляющем файле отменяет анало-
гичное указание,   сделанное ранее в командной строке.  Если файл
отсеянных записей с указанным именем уже существует, в зависимос-
ти от   типа  операционной системы он либо переписывается заново,
либо создается его новая версия.
    Режим чтения,  формат записи и самого файла отсеянных записей
совпадает с режимом чтения и аналогичными форматами файла данных,
поэтому в дальнейшем его можно использовать для повторной загруз-
ки с тем же самым управляющим  файлом  (после  изменения  условий
фильтрации, то есть предложений WHEN).

    Примеры описания файла отсеянных записей

    В первом примере укажем, что файл отсеянных записей имеет имя
CIRCULAR и расширение по умолчанию (DSC):

    DISCARDFILE CIRCULAR

    В следующем примере укажем,  что файл отсеянных записей имеет
имя FORGET и расширение ME:

    DISCARDFILE FORGET.ME

    И, наконец,   укажем,   что  файл отсеянных записей имеет имя
NOTAPPL и расширение MAY:

    DISCARDDN NOTAPPL.MAY

    Ограничение количества отсеиваемых записей

    Вы можете ограничить количество отсеиваемых при загрузке фай-
да данных записей, используя следующие параметры:

    [DISCARDMAX і DISCARDS] n        n - целое число (лимит).

    Если лимит исчерпан, обработка этого файла данных прекращает-
ся и  утилита  переходит к следующему файлу данных,  если таковой
имеется.
    Однажды заданный  лимит  распространяет  свое действие на все
файлы. Если  же он указан вместе с конкретным именем файла, дейс-
твие его ограничивается только этим файлом данных.

                                    -- 71 --



    В том случае, когда лимит указан, а имя файла отсеянных запи-
сей отсутствует,  утилита SQL*Loader создает файл с именем и рас-
ширением по умолчанию.

    Загрузка табличных данных в режимах  замены  и  добавления  в
    конец
    -------------------------------------------------------------

    Примечание: Материал этого раздела имеет много общего с рабо-
той утилиты DB2 в режиме RESUME; пользователям утилиты DB2 следу-
ет также обратиться к приложению C.

    Если те таблицы,  в которые Вы производите загрузку,  уже со-
держат какие-то данные, у Вас есть три возможности продолжить работу:
    * Загрузить Ваши данные, невзирая на ранее существовавшую информацию.
    * Заменить ранее существовавшие данные новыми.
    * Произвести загрузку данных только в пустые  таблицы.   Если
      таблица непуста, возвратить код ошибки и прекратить загруз-
      ку. (Действие по умолчанию.)

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

    [APPEND і REPLACE і INSERT]
где:

APPEND          Если таблица непуста, утилита SQL*Loader добавля-
                ет новые  строки  в конец нее; если пуста - новые
                строки загружаются обычным образом.

INSERT          Требует, чтобы данные загружались в пустые табли-
                цы. (Действие по умолчанию.)  Если таблица непус-
                та, утилита возвращает  код  ошибки  и  завершает работу.

REPLACE         Если таблица непуста, утилита заменяет ранее  су-
                ществовавшие строки новыми; если  пуста  -  новые
                строки загружаются обычным способом.  Таким обра-
                зом, старые строки теряются. Работа в этом режиме
                требует наличия  у пользователя полномочий удале-
                ния данных из таблиц.

    Данные, содержавшиеся в таблицах до загрузки и  потерянные  в
результате загрузки, могут быть восстановлены только утилитой Эк-
спорт или аналогичной ей.
    Один и  тот же режим Вы можете избрать для всех таблиц сразу,
если укажете его перед самым первым предложением INTO TABLE.   Вы
можете выбрать режим загрузки и для каждой таблицы в отдельности,
указав его после соответствующего предложения INTO TABLE.  Первое
указание режима относится ко всем таблицам, для которых индивиду-
альный режим загрузки не установлен.

    Установка максимальной длины логических записей
    -----------------------------------------------
    С помощью параметра RECLEN Вы можете задавать размер буферно-
го пространства, достаточный для размещения всей логической запи-
си. Это особенно важно в том случае,  когда утилита SQL*Loader не
может самостоятельно установить длину записи на основании  инфор-
мации о режиме чтения файла и расположении полей и данных в запи-

                                    -- 72 --



си. Если же длина логической записи велика и  утилита  SQL*Loader
обнаруживает при ее обработке ошибку, в файл плохих записей попа-
дет только фактически считанная часть записи.  Для того,  чтобы в
файл плохих записей в этом случае попадала вся логическая запись,
Вам следует указать параметр:
    RECLEN длина
где 'длина' - целое число, означающее максимальную длину логичес-
кой записи.  Значение по умолчанию для файлов, состоящих из запи-
сей фиксированной длины,  равно 80; если файл состоит из  записей
переменной длины,   значение  параметра  по умолчанию вычисляется
утилитой. Размер записи,  показанный в регистрационном файле, от-
ражает только размер буфера,  вычисляемый утилитой SQL*Loader, но
не число байт, считываемых по каждой записи.

    Формирование логических записей из физических
    ---------------------------------------------
    Формирование логической записи из нескольких физических может
производиться разными способами, с помощью одного из двух следую-
щих ключевых слов:
    CONCATENATE
    CONTINUEIF
    Фраза CONCATENATE используется в  простейшем  случае,   когда
утилита формирует  каждую  логическую  запись из одного и того же
количества физических записей. Синтаксис этой фразы следующий:
    CONCATENATE n
где n - целое число,  означающее количество  физических  записей,
объединяемых в одну логическую.
    Если количество объединяемых физических записей  варьируется,
используется фраза  CONTINUEIF.   В этой фразе за ключевым словом
CONTINUEIF следует условие, проверяемое при считывании каждой фи-
зической записи.  Примером такого условия может быть наличие сим-
вола "фунт стерлингов" в 80-й позиции записи,   означающее,   что
следующая запись будет объединяться с текущей. Синтаксис фразы:

      CONTINUEIF { [THIS і NEXT] (начало [:конец]) і LAST }
      операция { 'строка_символов' і X'шестнадцатиричная_строка' }
где:

THIS            Если в данной записи условие истинно, считывается
                следующая физическая запись, которая объединяется
                с текущей, и так до тех пор, пока условие не ста-
                нет ложным.   Если же в текущей записи условие не
                выполняется, текущая физическая запись становится
                последней, участвующей в формировании текущей ло-
                гической записи.  THIS подразумевается по умолча-
                нию.

NEXT            Если  в следующей записи условие истинно,  каждая
                следующая физическая запись будет объединяться  с
                текущей до  тех пор,  пока условие не станет лож-
                ным. Как только это произойдет,  текущая физичес-
                кая запись станет последней, участвующей в форми-
                ровании текущей логической записи.

начало:конец    Указание начального и конечного номеров позиций в
                физической записи.  Позиции нумеруются, начиная с
                1. В качестве  разделителя  может  использоваться
                дефис (начало-конец)   или  двоеточие (начало:ко-

                                    -- 73 --



                нец).
                Если "конец"  не  указан,  длина поля продолжения
                принимается равной длине строки байтов или строки
                символов. Если "конец" указан, но длина поля про-
                должения в результате отличается от длины  строки
                байтов или строки символов,  меньшая длина расши-
                ряется за счет дополнения:   символьных  строк  -
                пробелами, шестнадцатиричных - нулями.

LAST            Это условие похоже на условие THIS, но проверяет-
                ся при этом всегда последний отличный от  пробела
                символ. Если последний отличный от пробела символ
                удовлетворяет условию,  каждая следующая физичес-
                кая запись  будет  объединяться  с текущей до тех
                пор, пока условие не станет ложным.   Как  только
                это произойдет,  текущая физическая запись станет
                последней, участвующей в формировании текущей ло-
                гической записи.

операция        Разрешены операции,  связанные  с равенством  или
                неравенством:
                =    !=    ї=    <>
                Если используется операция типа равенства, то для
                того, чтобы  условие было истинно,  участвующие в
                сравнении значение поля и подстрока должны в точ-
                ности совпадать.  Если используется операция типа
                неравенства, сравниваемые значения  должны  отли-
                чаться по любому из символов.

строка_         Строка символов, сравниваемая с полем продолжения
символов        в указанных позициях  на предмет соблюдения усло-
                вия, заданного с помощью "операции". Строка может
                быть заключена в кавычки - двойные или одинарные.
                Сравнение производится посимвольно,  в случае не-
                обходимости справа добавляются пробелы.

X'шестнад-      Строка байтов в шестнадцатиричном формате,  обра-
цатиричная_     батывается так же, как и строка символов.  Строка
строка'         X'1FB033' описывает три байта, содержащие  значе-
                ния 1F, B0 и 33 (шестнадцатиричные).

    Примечание: Фраза CONTINUEIF адресуется к позициям каждой фи-
зической записи.  Это единственный случай подобного рода;  в  ос-
тальных случаях ссылки имеют отношение к логическим записям.

    Если фраза  имеет формат CONTINUEIF THIS или CONTINUEIF NEXT,
непосредственно перед сборкой логической записи поле  продолжения
убирается из всех физических записей. Это дает возможность форми-
ровать записи, в которых отсутствуют дополнительные символы (сим-
волы продолжения).   Рассмотрим  примеры использования CONTINUEIF
THIS и CONTINUEIF NEXT:
    CONTINUEIF THIS                    CONTINUEIF NEXT
    (1:2) = '%%'                       (1:2) = '%%'
    Пусть имеются четыре физические записи, в которых точка обоз-
начает пробел:
    %%aaaaaaaa                         ..aaaaaaaa



                                    -- 74 --



    %%bbbbbbbb                         %%bbbbbbbb
    ..cccccccc                         %%cccccccc
    %%dddddddd                         ..dddddddd

В обоих  случаях  логическая запись будет иметь один и тот же вид:
    aaaaaaaabbbbbbbbcccccccc
    Обратите внимание на то, что фраза CONTINUEIF LAST отличается
от фраз  CONTINUEIF THIS и CONTINUEIF NEXT тем,  что символы про-
должения из физических записей не убираются.

    Примеры использования фразы CONTINUEIF

    В первом примере укажем,  что если текущая физическая  запись
(назовем ее записью 1)  в первой позиции содержит звездочку, сле-
дующая физическая запись (запись 2) должна добавляться к ней. Ес-
ли и во второй записи содержится звездочка, запись 3 объединяется
с предыдущими двумя.
    Если во  второй  записи отсутствует звездочка (в первой позиции), 
эта запись добавится к первой, а запись 3 откроет новую логическую запись.

    CONTINUEIF THIS (1) = "*"

    В следующем  примере укажем,  что если текущая физическая за-
пись (запись 1)  содержит в последней отличной от пробела позиции
запятую, следующая физическая запись (запись 2) должна добавлять-
ся к ней.  В противном случае текущая физическая запись  является
последней, участвующей в формировании текущей логической записи.

    CONTINUEIF LAST = ","

    И наконец,  укажем, что если следующая физическая запись (за-
пись 2)  содержит в 7-й и 8-й позициях символы "10",  она  должна
добавляться к предыдущей физической записи (записи 1).  В против-
ном случае этой записью откроется новая логическая запись.

    CONTINUEIF NEXT (7:8) = '10'

    Описание таблиц и столбцов
    --------------------------
    Та часть оператора LOAD DATA,  которая содержит описание таб-
лиц, столбцов и типов данных,  называется блоком INTO  TABLE.   В
случае загрузки  нескольких таблиц на каждую из них отводится от-
дельный блок INTO TABLE.

    Описание имен таблиц

    Блок INTO TABLE открывается ключевым словом INTO  TABLE,   за
которым следует имя таблицы БД ORACLE.
    INTO TABLE имя_таблицы  [INSERT і APPEND і REPLACE]
    Таблица к  этому  моменту  уже должна существовать.  Если имя
таблицы совпадает с одним из ключевых слов, зарезервированных для
использования в языке SQL или утилитой SQL*Loader,  содержит спе-
циальные символы или чувствительно к размеру букв,   его  следует
заключить в двойные кавычки.

    INTO TABLE SCOTT."COMMENT"
    INTO TABLE SCOTT."comment"
    INTO TABLE SCOTT."-COMMENT"

                                    -- 75 --



    Пользователь, запустивший утилиту на выполнение, должен иметь
право вставлять (INSERT)  данные в таблицу,   иначе  имя  таблицы
должно содержать имя ее владельца:
    INTO TABLE SOPHIA.EMP

    Блок  INTO TABLE может включать в себя описание некоторых па-
раметров загрузки таблицы.  В частности,  по каждой таблице можно
указать, какое действие (INSERT,  APPEND, REPLACE) следует предп-
ринять в том случае, если таблица уже содержит какие-то данные.

    Выбор строк для загрузки

    Задание условия, определяющего выбор строк для загрузки, про-
изводится с помощью предложения WHEN.
    Предложение WHEN следует за именем таблицы  и  содержит  одно
или несколько подлежащих проверке условий (состояний).

    WHEN (состояние_поля) [AND (состояние_поля) ]...

    Предложение WHEN  похоже на предложение CONTINUEIF,  но имеет
два важных отличия. Первое отличие связано с тем, что ссылка про-
изводится на логическую запись,  а не на физическую. Второе отли-
чие заключается в том,  что в условии указывается либо позиция  в
логической записи,  либо имя столбца в загружаемой таблице. Усло-
вия, содержащиеся в предложении WHEN, оцениваются после определе-
ния значений столбцов.  Строка вставляется в таблицу только в том
случае, если все предложение принимает значение "Истина".
    Следующий пример говорит о том, что загрузке подлежат записи,
содержащие в 5-й позиции значение "q":

    WHEN (5) = 'q'
    Предложение WHEN может содержать несколько условий сравнения,
связанных между собой союзом AND.  Использование скобок в предло-
жении не обязательно,  но желательно,  как повышающее наглядность
представления. Например:
    WHEN (DEPTNO = '10') AND (JOB = 'SALES')

    Описание состояния поля

    Состояние поля представляет собой условие, оцениваемое в кон-
тексте логической записи.
    Оно используется в предложениях WHEN, NULLIF и DEFAULTIF.

  {( начало [:конец] ) і имя_столбца} операция {'строка_символов' і
     X'шестнадцатиричная_строка'}
где:

начало          Указание начальной позиции сравниваемого  поля  в
                логической записи.

конец           Указание  конечной позиции  сравниваемого поля  в
                логической записи.  Допускаются формы: начало-ко-
                нец или  начало:конец.   Если  "конец" не указан,
                длина поля определяется длиной подстроки  сравне-
                ния. Если  длины  поля  и  подстроки различаются,
                меньшая длина  расширяется  за  счет  дополнения:
                символьных строк - пробелами, шестнадцатиричных - нулями.


                                    -- 76 --



имя_столбца     Имя столбца в таблице БД.  Если  вместо  указания
                начала и конца поля используется имя столбца, по-
                ле описывается  спецификацией  столбца.   Это имя
                должно полностью совпадать с наименованием столб-
                ца в описании таблицы. Если имя столбца совпадает
                с одним из ключевых слов,  зарезервированных  для
                использования в    языке    SQL    или   утилитой
                SQL*Loader, содержит  специальные   символы   или
                чувствительно к размеру букв,  его следует заклю-
                чить в кавычки.

операция        Разрешены операции,  связанные  с равенством  или
                неравенством:
                =    !=    ї=    <>

'строка_        Строка  символов,  заключенная  в  одинарные  или
символов'       двойные кавычки и сравниваемая со значением поля.
                Если сравнение проходит, строка вставляется в таблицу.

X'шестнад-      Строка байтов в шестнадцатиричном формате,  обра-
цатиричная_     батывается так же, как и строка символов.
строка'

    Описание разделителей данных

    Если все поля в файле данных разделяются одинаково,  для опи-
сания разделителя можно использовать ключевое слово FIELDS. Кроме
того, может  использоваться  окаймляющий ограничитель.  Синтаксис
фразы FIELDS:

    FIELDS [TERMINATED [BY] {WHITESPACE і [X] 'символ'} ]
    [ [OPTIONALLY] ENCLOSED [BY] [X] 'символ' ]

    Ограничитель поля в любом месте может быть переопределен ука-
занием нового ограничителя после имени поля.  Более  подробно  об
описании ограничителя  см.   в  разделе настоящей главы "Описание
символьных данных с ограничителями".

    Описание столбцов

    Вы можете производить  загрузку  любого  количества  столбцов
таблицы. Все столбцы,  описанные в базе, но не указанные в управ-
ляющем файле,  заполняются пустыми значениями (это один из спосо-
бов ввода пустых значений).
    Описания столбцов должны заключаться в скобки,  каждое описа-
ние отделяется  от  следующего  запятой  и содержит имя столбца и
спецификацию его значения.  Если значение  считывается  из  файла
данных, его  спецификация  включает  в себя указание расположения
значения в записи, тип данных, разрешение пустого значения, умол-
чания на   значение.    Если   значение   генерируется   утилитой
SQL*Loader, спецификация включает ключевое слово RECNUM,  функцию
SEQUENCE или ключевое слово CONSTANT.

    Список столбцов  заключается  в  скобки,  столбцы разделяются
между собой запятыми:
    (описание_столбца, описание_столбца, ... )
    Имя каждого столбца должно соответствовать  имени  одного  из
столбцов таблицы,  указанной в предложении INTO. Если имя столбца

                                    -- 77 --



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

    Занесение константы в столбец

    Для занесения в столбец значения константы используйте фразу,
состоящую из ключевого слова CONSTANT и заносимого значения:
    CONSTANT значение
    Значение может быть заключено в кавычки, а в том случае, ког-
да значение содержит пробелы или зарезервированные слова, наличие
кавычек является обязательным.  Будьте внимательны при выполнении
назначения; если  назначение  константы сделано неправильно,  все
строки будут отвергнуты.
    Не используйте  ключевое слово CONSTANT для назначения пустых
значений. Чтобы назначить столбцу пустое значение,  этот  столбец
не следует  определять  совсем;  все неописанные обычным порядком
столбцы утилита SQL*Loader автоматически делает пустыми. Ключевое
слово CONSTANT  в  сочетании  со  значением  дает полное описание
столбца.

    Занесение в столбец номера записи из файла данных

    Для занесения в столбец номера логической записи, послужившей
основой для формирования строки таблицы,  используйте фразу, сос-
тоящую из ключевого слова RECNUM и имени столбца.  Записи нумеру-
ются последовательно, начиная с 1; отсчет ведется с самого перво-
го из файлов данных. Значение RECNUM увеличивается с каждой новой
логической записью; таким образом, оно увеличивается для всех за-
писей - отсеянных,  пропущенных,  отвергнутых и загруженных. Если
задать параметр  SKIP=10,   первой загруженной записи будет соот-
ветствовать значение RECNUM, равное 11.
    Ключевое слово  RECNUM в сочетании с именем столбца дает пол-
ное описание столбца.
    имя_столбца RECNUM

    Генерация уникальных порядковых номеров

    С помощью  функции  SEQUENCE можно гарантировать уникальность
содержащихся в любом указанном столбце значений.
    Значение SEQUENCE увеличивается с  каждой  новой  загруженной
или отвергнутой  записью; оно не изменяется,  если запись отсеяна
или пропущена. Функция имеет два аргумента. Первым аргументом яв-
ляется значение,  соответствующее началу отсчета, вторым - прира-
щение. Если  в качестве начальной точки указано положительное це-
лое число   n,  первая вставляемая строка будет иметь в указанном
столбце значение n; в последующих строках соответствующее  значе-
ние будет увеличиваться на величину приращения.
    Функция SEQUENCE  в  сочетании  с  именем столбца дает полное
описание столбца.

       имя_столбца SEQUENCE ( { n і MAX і COUNT } [,приращение] )
где:

SEQUENCE        Функция SEQUENCE, описывающая значение столбца.



                                    -- 78 --



n               Целое число,  соответствующее началу отсчета зна-
                чения столбца.

COUNT           Начало  отсчета  определяется  исходя  из   числа
                строк, уже имеющихся в таблице, и приращения.

MAX             Начало отсчета определяется исходя  из максималь-
                ного из имеющихся значения данного столбца и при-
                ращения.

приращение      Величина  увеличения  значения столбца для каждой
                последующей строки. По умолчанию равна 1.

    Если строка  отвергнута (то есть имеется форматная ошибка или
ошибка СУБД ORACLE),  этот факт не скрывается  и  сгенерированные
порядковые номера  не пересчитываются.  Пусть,  например,  четыре
строки содержат в означенном столбце порядковые номера 10, 12, 14
и 16, тогда если строка с номером 12 отвергается, три загруженные
строки будут содержать значения 10,  14 и 16,  а не 10,  12,  14.
Таким образом,  функция позволяет сохранить порядок номеров, нес-
мотря на ошибки в данных.  Когда Вы  откорректируете  отвергнутые
данные и  произведете  их повторную загрузку,  Вы вручную сможете
привести значения столбцов в соответствие со сложившейся  нумерацией.

    Указание расположения информационного поля

    Чтобы загрузить значение, содержащееся в информационном поле,
утилита SQL*Loader должна иметь представление о том, где располо-
жено само поле,  и его длину.  Указание расположения поля в логи-
ческой записи производится с помощью предложения POSITION,  вклю-
ченного в  спецификацию  столбца.   Расположение  поля может быть
описано как явно,  так и по отношению к предшествующему полю. Ар-
гументы фразы POSITION заключаются в круглые скобки.

    POSITION ( { начало [:конец] і * і [+n] } )
где:

начало          Указание начальной позиции информационного поля в
                логической записи.  Первая позиция  записи  имеет номер 1.

конец           Указание  конечной позиции информационного поля в
                логической записи.  Допускаются формы: начало-ко-
                нец или начало:конец.  Если  "конец"  не  указан,
                длина поля выводится исходя из типа данных.  (См.
                разделы по каждому типу данных; учтите,  что  тип
                CHAR без  указания  начальной  и конечной позиций
                означает длину,  равную 1.)  Если из типа  данных
                вывести длину не представляется возможным,  выда-
                ется сообщение об ошибке.

*               Означает, что текущее поле начинается непосредст-
                венно после предыдущего поля. Если текущее поле -
                первое, символ "*" означает,  что поле располага-
                ется с самого начала логической записи.  Если на-
                чальная и конечная позиции не указаны, длина поля
                выводится из типа данных.



                                    -- 79 --



+n              Смещение текущего поля  относительно предыдущего,
                может использоваться в сочетании  со  звездочкой.
                Перед считыванием значения поля будет пропущено n символов.

    Вы можете опустить фразу POSITION полностью.  В  этом  случае
описание расположения поля будет таким же,  как и при использова-
нии фразы в формате POSITION (*).
    При загрузке нескольких таблиц фраза POSITION (*) для первого
столбца первой таблицы означает,  что столбец располагается с са-
мого начала логической записи. Та же фраза по отношению к первому
столбцу всех последующих таблиц означает, что их расположение оп-
ределяется относительно последнего столбца последней из загружен-
ных таблиц.

    Таким образом,  во втором и последующих блоках INTO TABLE по-
ложение столбцов   устанавливается   не  по  отношению  к  началу
логической записи, если только об этом не сказано явно. Выполнить
последнее просто. Вместо того, чтобы опускать описание расположе-
ния поля или использовать фразу POSITION (*+n) для первого поля в
каждом из последующих блоков INTO TABLE,  включите фразу POSITION
(1) или POSITION (n).  Это позволит производить загрузку несколь-
ких таблиц в том случае,  когда данные для одной таблицы распола-
гаются в той же самой логической записи; в  этом  случае  Вам  не
придется переустанавливать значение POSITION.
    Если логическая запись содержит данные для одной или для дру-
гой таблицы, но не для обеих сразу, Вы можете переустановить зна-
чение POSITION.
    Несколько примеров:
    SITEID  POSITION (*) SMALLINT
    SITELOC POSITION (*) INTEGER

    Если таким образом описать первые два столбца, столбец SITEID
будет располагаться,  начиная с первой позиции, а столбец SITELOC
сразу после столбца SITEID.
    ENAME   POSITION (1:20) CHAR
    EMPNO   POSITION (22-26) INTEGER EXTERNAL
    ALLOW   POSITION (*+2)  INTEGER EXTERNAL TERMINATED BY "/"

    Столбец ENAME содержит значение в символьном формате,  считы-
ваемое из  позиций  с 1-й по 20-ю,  за ним следует столбец EMPNO,
содержащий числовое данное,  считываемое из  позиций  с  22-й  по
26-ю. Столбец ALLOW содержит значение, считываемое после значения
EMPNO со смещением +2,  то есть с позиции 28, и до появления сим-
вола "наклонная черта".

    Указание длины информационного поля

    Размеры полей  могут указываться несколькими способами.  Если
случайно сделать два указания,  одно из них будет иметь старшинс-
тво над  другим.   Описание  размеров полей подчиняется следующим
правилам:
    * Длина  поля,  вытекающая из типа содержащегося в нем значе-
      ния, перекрывает длину, вытекающую из фразы POSITION (нача-
      ло:конец) или  из длины значения между двумя ограничителями
      в записи свободного формата.
    * Длина поля,  вытекающая из фразы  POSITION  (начало:конец),
      перекрывает длину, вытекающую из размерности значения между
      двумя ограничителями в записи свободного формата.

                                    -- 80 --



    * Длина поля,  вытекающая из размерности значения между двумя
      ограничителями в  записи  свободного  формата,  перекрывает
      длину, вытекающую из фразы POSITION,  если эта фраза описы-
      вает только начальную позицию.
    * Символьные данные (CHARACTER),  для которых известна только
      начальная позиция их расположения (фраза ENCLOSED BY и дли-
      на отсутствуют), по умолчанию имеют длину, равную 1.

    Указание типа содержащегося в информационном поле значения

    После указания расположения значения в логической записи  Вам
следует описать  его тип.  При этом имеется в виду тип значения в
записи файла, который может не совпадать с типом значения, содер-
жащегося в столбце таблицы БД ORACLE. Типы значений могут не сов-
падать в силу того, что СУБД автоматически выполняет преобразова-
ние типов. Тем не менее, Вам следует проследить за тем, чтобы это
преобразование имело надлежащий смысл и не приводило к ошибкам.
    Если, к примеру,  значение типа CHAR преобразуется в значение
типа NUMBER,  следует предусмотреть, чтобы содержимое символьного
поля представляло  собой  допустимое  с  точки  зрения  числового
представления значение.  Для каждого поля  может  быть  определен
только один тип данных. Если тип данных не указан, подразумевает-
ся тип CHAR.

    Тип CHAR
    Поле этого типа содержит символьные значения.  Длина поля яв-
ляется необязательным параметром и если здесь она не указана, она
выбирается из спецификации POSITION.  Если же длина указана явно,
она отменяет значение,  заданное в спецификации  POSITION.   Если
длина не  указана  нигде,   значение типа CHAR будет иметь длину,
равную 1.

    CHAR [ ( длина ) ] [ спецификация_ограничителя ]

    Поле типа CHAR может быть и переменной длины,  в этом  случае
используются ограничители   - окаймляющие или завершающие.  Более
подробно об этом см. в разделе настоящей главы "Описание символь-
ных данных с ограничителями".
    Если столбец в таблице БД определен как LONG, Вам следует яв-
но указать  максимальную  длину  поля  (с помощью ключевого слова
LENGTH или фразы POSITION).  Такая мера  позволит  гарантировать,
что для  значения  поля  будет  выделен буфер достаточно большого
размера, необходимый даже в том случае, когда поле снабжено огра-
ничителями.

    Тип DATE
    Поле этого типа содержит символьные  значения,  преобразуемые
СУБД ORACLE в дату в соответствии с заданной маской. Например:
    LOAD DATA
    INTO TABLE DATES (COL_A POSITION (1:15) DATE 'DD-Mon-YYYY')
    BEGINDATA
    01-Jan-1066
    01-Apr-1534
    28-Feb-2004

    Длина поля  является  необязательным  параметром и если здесь
она не указана,  она выбирается из спецификации POSITION. Если же
длина указана явно,  она отменяет значение, заданное в специфика-

                                    -- 81 --



ции POSITION. Маской может быть любая известная СУБД ORACLE маска
даты. Если  маска  опущена,  по умолчанию используется комбинация
"DD-MON-YY". Длина заключается в круглые скобки, а маска в кавычки.
    DATE [ ( длина ) ] [ маска ] [ спецификация_ограничителя ]

    Поле типа DATE может быть и переменной длины,  в этом  случае
используются ограничители   - окаймляющие или завершающие.  Более
подробно об этом см. в разделе настоящей главы "Описание символь-
ных данных с ограничителями".

    Тип VARCHAR
    Поле этого  типа содержит символьную строку переменной длины,
открывающуюся двухбайтным префиксом, описывающим длину поля. Поле
располагается, начиная   с   позиции,   указанной  в  предложении
POSITION. Первые два байта,  составляющие префикс,  в общую длину
поля не  включаются.   Если предложение POSITION задано в формате
POSITION (начало:конец), "конец" поля игнорируется.

    VARCHAR [ ( длина ) ]
    Если после ключевого слова VARCHAR Вы указали значение необя-
зательного параметра "длина", это значение будет использоваться в
целях буферизации в качестве максимального  размера  поля.   Если
"длина" не указана, под буфер будет выделено 2 Кбайта.

    Тип SMALLINT
    Поле этого типа содержит двоичное целое значение  размером  в
полуслово. Если    предложение POSITION задано в формате POSITION
(начало:конец), "конец" поля игнорируется. Длина поля совпадает с
размером целого числа,  помещающегося в полуслове, принятом в Ва-
шей системе. (В языке Си ему соответствует тип SHORT INT.)
    SMALLINT

    Тип INTEGER
    Поле этого типа содержит двоичное целое значение  размером  в
полное слово. Если предложение POSITION задано в формате POSITION
(начало:конец), "конец" поля игнорируется. Длина поля совпадает с
размером целого числа,  помещающегося в полном слове,  принятом в
Вашей системе. (В языке Си ему соответствует тип LONG INT.)
    INTEGER

    Тип FLOAT
    Поле этого типа содержит двоичное значение с плавающей  запя-
той одинарной  точности.  Если в предложении POSITION указана ко-
нечная позиция поля,  она игнорируется.  Длина поля  совпадает  с
размером двоичного числа с плавающей запятой, помещающегося в од-
ном слове.  (В языке Си ему соответствует тип того же  наименова-
ния.)
    FLOAT

    Тип DOUBLE
    Поле этого  типа содержит двоичное значение с плавающей запя-
той двойной точности.  Если в предложении POSITION указана конеч-
ная позиция поля, она игнорируется. Длина поля совпадает с разме-
ром двоичного числа с плавающей запятой,  помещающегося в двойном
слове. (В  языке Си ему соответствует тип DOUBLE или LONG FLOAT.)
    DOUBLE



                                    -- 82 --



    Тип DECIMAL
    Поле этого  типа содержит число в упакованном десятичном фор-
мате. Число в этом формате представляет собой  последовательность
десятичных цифр,  каждая из которых занимает четыре бита, со зна-
ком, на который также отводится четыре бита.
    Формат DECIMAL  требует  указания  разрядности (максимального
количества цифр) в значении поля. На этой основе вычисляется дли-
на упакованного десятичного поля в байтах. Вы можете также указы-
вать точность задания значения или  коэффициент  масштабирования.
Таким способом задается количество цифр справа от десятичной точки.
    DECIMAL ( разрядность [,точность] )
где:

разрядность     Количество цифр в значении, определяющее его дли-
                ну. Необходимо заметить, что действительная длина
                вычисляется как (разрядность+2)/2 с округлением в
                меньшую сторону.

точность        Коэффициент масштабирования  или  количество цифр
                справа от десятичной точки.  По умолчанию - 0  (и
                значение при  этом будет целым).  Может превышать
                разрядность, но не может быть отрицательным  числом.

    Тип EXTERNAL для числового поля
    Поле этого типа содержит  число  во  внешнем  (неупакованном)
формате (то есть в символьной,  а не в двоичной форме).  Раз так,
то этот тип идентичен типу CHAR (см.  выше) и трактуется идентич-
ным образом,  с одним исключением, касающимся использования фразы
DEFAULTIF. Если Вы хотите,  чтобы значение по умолчанию было пус-
тым, используйте тип CHAR; если - нулевым,  используйте EXTERNAL.
Числовое поле типа EXTERNAL,  подобно данным  типа  CHAR,   может
иметь необязательный параметр "длина" и ограничители.  Если длина
указана, она отменяет значение, заданное в спецификации POSITION.
    INTEGER EXTERNAL [ ( длина ) ] [ спецификация_ограничителя ]
    DECIMAL EXTERNAL [ ( длина ) ] [ спецификация_ограничителя ]
    FLOAT   EXTERNAL [ ( длина ) ] [ спецификация_ограничителя ]


    Тип GRAPHIC
    Поле этого типа содержит строку символов,  каждый из  которых
занимает два  байта (английское сокращение DBCS - от "double-byte
characters"). СУБД  ORACLE не поддерживает символы DBCS;  тем  не
менее, утилита  SQL*Loader считывает эти символы как однобайтовые
и запоминает их без модифицирования  в  указанном  Вами  столбце.
Единственное исключение касается длины. Если Вы используете фразу
POSITION (начало:конец), она будет определять точное местоположе-
ние поля в логической записи. Однако, Вы можете задать длину поля
после ключевого слова GRAPHIC,  в этом случае размер поля измеря-
ется в символах DBCS, поэтому для нахождения действительной длины
поля в байтах его необходимо умножить на 2.
    Если поле,   содержащее  символы DBCS,  заключено между двумя
символами - переключения на стандартный  (SI)   и  дополнительный
(SO) регистры,  для его описания следует использовать тип GRAPHIC
EXTERNAL. Этот тип идентичен типу GRAPHIC,  если не считать того,
что символы переключения регистров не загружаются.

    GRAPHIC EXTERNAL [ ( длина ) ]
где:

                                    -- 83 --



GRAPHIC         Означает, что поле состоит из символов DBCS.

EXTERNAL        Первый и последний символы игнорируются.

длина           Длина поля в символах DBCS.

    Все вышеизложенное можно пояснить на примере:
    Обозначим символы переключения регистров через [],   а  любой
символ DBCS через #.
    Для того,   чтобы  описать  поле  ####,   используйте   фразу
"POSITION (1:4) GRAPHIC" или фразу "POSITION (1) GRAPHIC (2)".
    Для того,  чтобы  описать  поле  [####],   используйте  фразу
"POSITION (1:6) GRAPHIC EXTERNAL" или фразу "POSITION (1) GRAPHIC
EXTERNAL (2)".

    Тип VARGRAPHIC
    Поле этого типа содержит строку символов DBCS,  имеющую пере-
менную длину.  В первых двух байтах указывается размер поля. Раз-
мер дается в символах DBCS, поэтому для нахождения действительной
длины поля в байтах его необходимо умножить на 2.  Длина поля мо-
жет быть  указана явно,  после ключевого слова VARGRAPHIC,  таким
образом Вы можете обеспечить  оптимальный  размер  буфера.   Если
"длина" не указана, под буфер отводится 4 Кбайта.
    VARGRAPHIC [ ( длина ) ]

    Описание символьных данных с ограничителями

    Поля типов CHAR, DATE и EXTERNAL (числовые) могут иметь огра-
ничители - завершающие и окаймляющие.  Соответственно,  поля, ис-
пользующие ограничители,  могут быть двух  типов:   TERMINATED  и
ENCLOSED. Спецификация   ограничителя указывается после типа данных.

    Значения с завершающими ограничителями считываются  с  первой
позиции поля  (которая может устанавливаться относительно послед-
ней позиции предыдущего поля)  до первого появления символа-огра-
ничителя. Символ-ограничитель не включается в значение поля. Если
в качестве ограничителя используется пробел (WHITESPACE),  данные
считываются до первого появления пробела (пустой позиции, символа
табуляции, символа перехода на новую строку). После этого текущая
позиция продвигается  до  первого символа,  отличного от пробела.
Таким образом, значения полей могут разделяться любым количеством
пробелов и будут при этом допустимыми.
    Значения с окаймляющими ограничителями считываются между дву-
мя парными символами-ограничителями. Если два символа-ограничите-
ля следуют один за другим,  один из них включается в значение по-
ля. Например,   последовательность  'DON''T'  воспринимается  как
DON'T. Однако,  если поле состоит только из двух символов  и  оба
они являются ограничителями, значение поля будет пустым. При опи-
сании ограничителей Вы можете пользоваться фразами TERMINATED  BY
или ENCLOSED BY или обеими сразу. В последнем случае порядок рас-
положения фраз следующий:

    [ TERMINATED [ BY ] { WHITESPACE і [X]'символ' } ]
      [ [ OPTIONALLY ] ENCLOSED [ BY ] [X]'символ' ]
где:

TERMINATED      Означает, что данные считываются до первого появ-
                ления символа-ограничителя.

                                    -- 84 --



OPTIONALLY      Данные  могут быть заключены между двумя символа-
                ми, указанными во фразе ENCLOSED BY. Утилита SQL*
                Loader обнаруживает первое появление окаймляющего
                ограничителя и  считывает  значение  до появления
                парного ограничителя.  При этом фраза  TERMINATED
                BY в  предложении  FIELDS должна обязательно при-
                сутствовать, будь то локально или глобально.

ENCLOSED        Значение поля помещается между двумя окаймляющими
                ограничителями.

BY              Необязательное ключевое слово, облегчающее чтение фразы.

WHITESPACE      Означает, что ограничителем является любой пустой
                символ, в том числе символы перевода строки,  пе-
                ревода страницы  или  возврата каретки (только TERMINATED).

символ          Одинарный символ-ограничитель.

x'шестнадца-    Означает, что в качестве  ограничителя  выступает
  тиричное-     символ  с  указанным в  шестнадцатиричной системе
  байтовое'     кодом ASCII.

    Указание типа  данных  с ограничителями является единственным
способом загрузки конечных пробелов.

    Если информационное поле имеет длину 8  символов  и  содержит
значение DANIELbbb,  где bbb - три пробела, оно будет загружено в
БД ORACLE как  "DANIEL"  при  условии,   что  оно  объявлено  как
CHAR(8). Однако, если Вам нужно загрузить и конечные пробелы, по-
ле следует объявить как CHAR(8)  TERMINATED BY ':' и  добавить  в
конце его двоеточие, в результате чего значение поля будет выгля-
деть как DANIELbbb:. Тогда поле будет загружено вместе с конечны-
ми пробелами ("DANIEL   ").

    Занесение в столбец пустого значения

    Если Вам нужно, чтобы все заносимые в данный столбец значения
были пустыми, описание столбца следует опустить полностью. Значе-
ние столбца можно сделать нулевым и по некоторому условию, прове-
ряемому в каждой логической записи. Это делается с помощью ключе-
вого слова NULLIF,  которое появляется после описания типа поля и
спецификации ограничителя; в фразу NULLIF помимо ключевого  слова
включается условие,  имеющее ту же форму, что и условие в предло-
жении WHEN. Значение столбца становится пустым, если условие "ис-
тинно", в противном случае значение не изменяется.
    NULLIF состояние_поля
    Обратите внимание на то, что условие может быть "возвратным",
как в следующем примере:
    COLUMN1  POSITION(11:17)  CHAR  NULLIF (COLUMN1 = "unknown")

    Значение поля в файле данных сначала анализируется,  а  затем
делается пустым непосредственно перед загрузкой в базу. Это может
пригодиться в том случае,  если Вам понадобится определенные зна-
чения заменить пустыми.

    Занесение нуля в столбец числового типа


                                    -- 85 --



    Если вместо пустого значения Вы хотите занести в столбец чис-
лового типа нуль, вместо предложения NULLIF используйте предложе-
ние DEFAULTIF.  Если столбец не числовой, а символьный, его лучше
сделать пустым.  Описание столбца может включать как  предложение
NULLIF, так и предложение DEFAULTIF, хотя в некоторых случаях это
излишне.
    DEFAULTIF состояние_поля
    Обратите внимание на то,  что использование фразы DEFAULTIF в
отношении данных  типа NUMERIC EXTERNAL приводит к обнулению зна-
чения, в то время как в отношении данных типа CHAR эта фраза поз-
воляет получить пустое значение.  Подробности см. в разделе "Опи-
сание состояния поля".

    Указание начала загружаемых данных в управляющем файле
    -------------------------------------------------------------

    Если Ваши данные располагаются в том же файле,  что и предло-
жение LOAD DATA,  перед началом самих  данных  следует  поместить
ключевое слово  BEGINDATA,  означающее завершение управляющей ин-
формации и открывающее собой порцию загружаемых данных.
    BEGINDATA
    Если указанное слово пропущено, утилита SQL*Loader предпримет
попытку интерпретации  Ваших  данных как управляющей информации и
Вы получите сообщение об ошибке.  Если данные располагаются в от-
дельном файле, об окончании управляющей информации будет сигнали-
зировать обнаружение конца управляющего файла, в этом случае клю-
чевое слово BEGINDATA не требуется.

KOAP Open Portal 2000