Внешние таблицы — частичная запись в конце ошибки файла при использовании FIXED

Я получаю сообщение об ошибке "частичная запись в конце файла" при использовании параметра FIXED с внешними таблицами.

Я использую SQL Developer, Oracle 11g XE.

-------
foo.dat - Field lengths: fname=7;lname=8;year=4
-------
Alvin  Tolliver1976
KennethBaer    1963
Mary   Dube    1973 

Вот DDL для таблицы:

CREATE TABLE emp_load (
    first_name CHAR(7)
    , last_name CHAR(8)
    , year_of_birth CHAR(4)
)
  ORGANIZATION EXTERNAL (
     TYPE ORACLE_LOADER 
     DEFAULT DIRECTORY ext_tab_dir
     ACCESS PARAMETERS (
           RECORDS FIXED 20 FIELDS (
               first_name CHAR(7)
               , last_name CHAR(8)
               ,  year_of_birth CHAR(4)
               )
      )
      LOCATION ('foo.dat'));

Таблица emp_load создается, но оператор select завершается с ошибкой ниже. Сообщение об ошибке при выполнении select * from emp_load :

ORA-29913: error in executing ODCIEXTTABLEFETCH callout
ORA-29400: data cartridge error
KUP-04018: <b>partial record at end of file C:\oracle\foo.dat</b>
29913. 00000 -  "error in executing %s callout"
*Cause:    The execution of the specified callout caused an error.
*Action:   Examine the error messages take appropriate action.

Единственный раз, когда это сработало, это когда я сделал foo.dat 1 строку (как показано ниже) и изменил ФИКСИРОВАННУЮ длину на 19-

Alvin  Tolliver1976KennethBaer    1963Mary   Dube    1973

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

Любая помощь будет оценена по достоинству. Заранее спасибо!


person user637563    schedule 16.10.2011    source источник
comment
Я думаю, вам нужно DELIMITED BY NEWLINE : download.oracle. com/docs/cd/B19306_01/server.102/b14215/   -  person ypercubeᵀᴹ    schedule 16.10.2011
comment
@ypercude: Боюсь, ты ошибся. Из приведенной вами спецификации: Предложение FIXED используется для идентификации записей как имеющих фиксированный размер байтов длины. Размер, указанный для записей FIXED, должен включать любые символы завершения записи, такие как символы новой строки. Я думаю, что DDL OP правильный.   -  person user272735    schedule 17.10.2011


Ответы (2)


Вам не хватает символа новой строки после последней строки в многострочном файле данных. То есть ваша последняя длина строки составляет 19 байтов, а не 20 байтов. Вы можете проверить размер вашего файла данных - он должен быть 3 * 20 = 60 байт.

Когда вы изменяете файл данных, чтобы все данные были в одной строке, и используете RECORDS FIXED 19, все снова хорошо, потому что теперь не ожидается новая строка.

person user272735    schedule 17.10.2011

Я нашел ответ..

В документации сказано, что FIXED предполагает символ новой строки в конце.

В Windows символ новой строки (\r\n) занимает 2 байта.
Итак, в Windows длина, передаваемая в FIXED, должна быть равна общей длине полей + 2< /strong>
В Unix это должно быть = общая длина полей + 1

Я установил Oracle 11g на свой компьютер с Windows Vista. Поэтому общая длина равна 21, а не 20.

Пример в документации, вероятно, был для Unix, который использует 1 байт для новой строки (\n)

Итак, это правильный код, если Oracle 11g установлен в Windows -

CREATE TABLE emp_load (first_name CHAR(15), last_name CHAR(20), year_of_birth CHAR(4))
  ORGANIZATION EXTERNAL (TYPE ORACLE_LOADER DEFAULT DIRECTORY filesdir
                         ACCESS PARAMETERS (RECORDS FIXED 21 FIELDS 
                                              (first_name CHAR(7),
                                               last_name CHAR(8),
                                               year_of_birth CHAR(4)))
                         LOCATION ('info1.dat'));

Спасибо ypercube за альтернативное решение. Я проголосовал за ваше предложение. (Предложение ypercube использовать DELIMITED BY NEWLINE предоставило альтернативу, на самом деле более простое решение. Но я хотел опубликовать вышеизложенное, так как думаю, что это будет полезно для тех, кто пытается использовать пример из документации Oracle для FIXED.)

person user637563    schedule 17.10.2011