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/')
我正在尝试使用 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/')