sqlldr:为空值获取 'ORA-19032: Expected XML tag, got no content'

sqlldr: Getting 'ORA-19032: Expected XML tag, got no content' for null values

我正在尝试使用 oracle sqlldr 加载 table,但在(允许的!)空字段上得到 ORA-19032: Expected XML tag, got no content

如果 table 由插入填充,或者列更新为空,则一切正常。但是通过 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)
)

Table定义:

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>"|

注意:通常,我会为 "normal columns" 创建 "correct" 数据类型,但 ctl 文件是由卸载脚本创建的...而且有效 ;)

重要:它适用于 xml 列的非空值。

希望有办法修改ctl-File中相应的行,但是我还没有找到解决方法

问题似乎是,在加载程序执行的某个时刻,会发生类似于以下内容的情况,其中 NULL 值作为参数传递给 XmlType(value) 构造函数或 createXML(value)函数:

select XmlType('') as xml_value from dual;

我已经尝试了几种方法来解决它,但都没有成功。有空的时候可以继续研究,但我想至少post这个作为一个解释。您可以(hackily)通过执行以下操作来解决此问题:

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)
)

这不是理想的解决方案,但它应该能让您继续前进。如果你最终只走这条路,请告诉我,否则我会看看能不能找到更好的东西。

使用带有 XMLTYPE 的 nval 函数在空值的情况下提供虚拟 xml。

EXTRACTVALUE(XMLTYPE(nvl(XML_COLUMN, '1')), '/XPATh/')