【问题标题】:sqlldr: Getting 'ORA-19032: Expected XML tag, got no content' for null valuessqlldr:获取空值的“ORA-19032:预期的 XML 标记,没有内容”
【发布时间】:2019-10-17 11:41:31
【问题描述】:

我正在尝试使用 oracle 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 文件是由卸载脚本创建的......并且它可以工作;)

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

希望有办法修改ctl-File中的对应行,但目前还没有找到解决办法。

【问题讨论】:

    标签: oracle sql-loader


    【解决方案1】:

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

    select XmlType('') as xml_value from dual;
    

    我尝试了几种方法来解决它,但都没有成功。当我有更多时间时,我可以继续研究它,但我想至少发布这个作为解释。您可以(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)
    )
    

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

    【讨论】:

    • 谢谢,我什至考虑过那个解决方案,但是当我遇到NORMAL_COLUMN3 XOR XML_COLUMNNULL 的约束时,如果我想去的话,我需要在解决方法之后找到一个解决方法那样:(
    • @evilive 您可以在该表上放置BEFORE 行触发器,以检查传入值,如果它等于'',则将其设置为null。这应该可以解决问题。
    • @gimley:好的,再次感谢你,但这一切都太脏了;)我选择了 XML 数据类型来与“关闭”其他表保持一致,因为如果它会更好工作(手动查询中的 XPATH,没有可能的无效 XML 结构等)。但是由于该应用程序也可以与 varchar2 一起使用,所以我现在刚刚切换到该应用程序,我们所有的“标准流程”都可以像以往一样工作。无论如何我都会接受你的回答,因为 ORA-19032 会消失 ;)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-19
      相关资源
      最近更新 更多