sqlldr: получение «ORA-19032: ожидаемый тег XML, нет содержимого» для нулевых значений - PullRequest
1 голос
/ 17 октября 2019

Я пытаюсь загрузить таблицу с оракулом sqlldr, но получаю ORA-19032: Expected XML tag, got no content для (разрешенных!) Пустых полей.

Если таблица заполняется вставками или столбец обновляется до нуля, всегдаЭто хорошо. Но загрузка через sqlldr не работает.

Вызов загрузчика:

sqlldr $DBCS control=$TABLE.ctl data=$TABLE.csv bad=$LOGDIR/$TABLE.bad log=$LOGDIR/$TABLE.log rows=10000 bindsize=20000000 readsize=20000000 silent=header,feedback

CTL-файл:

LOAD DATA
INFILE MY_TABLE.csv "STR '|\n'"
INTO TABLE MY_TABLE APPEND
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
  "NORMAL_COLUMN1" CHAR(40)
, "NORMAL_COLUMN2" CHAR(250)
, "NORMAL_COLUMN3" CHAR(250)
, "XML_COLUMN" CHAR(16000)
)

Определение таблицы:

CREATE TABLE MY_TABLE
(
  NORMAL_COLUMN1        NUMBER(14) not null,
  NORMAL_COLUMN2        VARCHAR2(250) not null,
  NORMAL_COLUMN3        VARCHAR2(250),
  XML_COLUMN            SYS.XMLTYPE    
);

CSV-строка - не работает:

21001;"lulul";"lalal";|

CSV-строка - работает:

21001;"lulul";;"<a>ala</a>"|

Примечание : В целом, я бы создал "правильно"типы данных для" обычных столбцов ", но ctl-файл создается сценарием unload ... и он работает;)

Важно : работает для ненулевых значенийдля столбца xml.

Я надеюсь, что есть способ изменить соответствующую строку в ctl-файле, но я пока не нашел решения.

1 Ответ

0 голосов
/ 17 октября 2019

Проблема заключается в том, что в какой-то момент при выполнении этого загрузчика происходит нечто похожее на следующее, когда значение NULL передается в качестве параметра конструктору XmlType(value) или функции createXML(value):

select XmlType('') as xml_value from dual;

Я попробовал несколько способов обойти это безуспешно. Я могу продолжить исследовать это, когда у меня будет больше времени, но я хотел, по крайней мере, опубликовать это как объяснение. Вы можете (к счастью) обойти это, сделав что-то вроде:

LOAD DATA
INFILE MY_TABLE.csv "STR '|\n'"
INTO TABLE MY_TABLE APPEND
FIELDS TERMINATED BY ';'
OPTIONALLY ENCLOSED BY '"'
TRAILING NULLCOLS
(
  "NORMAL_COLUMN1" CHAR(40)
, "NORMAL_COLUMN2" CHAR(250)
, "NORMAL_COLUMN3" CHAR(250)
, "Nvl(XML_COLUMN, '<empty />')" CHAR(16000)
)

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

...