限制XMLAgg或XMLStyle.createxml()

时间:2019-05-06 08:29:32

标签: xml oracle oracle12c

我上个月切换到Oracle 12g,现在1条查询产生了奇怪的问题。 这是一个非常复杂的Tablelayout,所以只需测试以下表格即可:

create table Order (
    id int not null,
    name varchar(255)
)

create table Position (
    id int not null,
    orderFk int not null,
    name varchar(255)
)

create table CNCData (
    id int not null,
    positionFk int not null,
    ncdata clob
)

CNCData.ncdata的大小可以为4GB,因此它将交给我生成的代码,有时这确实很大。

当我执行此查询时:

SELECT
  XmlElement("node", XMLAttributes('nc' AS "name", 'root' AS "value"),
    XmlElement("node", XMLAttributes('Order' AS "name", 'section' AS "value"), 
      XmlElement("node", XMLAttributes('OrderName' AS "name", o.name AS "value") ),
      XmlElement("node", XMLAttributes('OrderNr' AS "name", o.id AS "value") ),
      XmlElement("node", XMLAttributes('CreationDate'    AS "name", to_char(systimestamp ,'YYYY-MM-DD"T"HH24:MI:SS"Z"') AS "value") ),
      XMLAgg(
        XmlElement("node", XMLAttributes('Position' AS "name", 'section' AS "value"),
          XmlElement("node", XMLAttributes('PositionName' AS "name",  p.name AS "value") ),
          XmlElement("node", XMLAttributes('PositionNr' AS "name",  p.id AS "value") ),
          XMLAgg(
            XmlElement("nc_node", XMLTYPE.createxml(nc.ncdata))
              ) ORDER BY p.id
  ))))).getCLOBval() xml

FROM Order o
JOIN Position p ON o.id = p.orderFk
JOIN CNCData nc ON p.id = nc.positionFk
WHERE  o.id = 1234
GROUP BY p.name, p.id

我希望此输出为CLOB:

<node name="nc" value="root">
  <node name="Order" value="section">
    <node name="OrderNr" value="1234" />
    <node name="OrderName" value="Testorder" />
    <node name="CreationDate" value="2019-04-24T10:20:31Z" />

    <node name="Position" value="section">
        <node name="PositionNr" value="1" />
        <node name="PositionName" value="pos1" />
        <nc_node>
            -- XML CLOB DATA
        </nc_node>
    </node> <!-- Position -->

    <node name="Position" value="section">
        <node name="PositionNr" value="2" />
        <node name="PositionName" value="pos2" />
        <nc_node>
            -- XML CLOB DATA
        </nc_node>
    </node> <!-- Position -->

    <node name="Position" value="section">
        <node name="PositionNr" value="3" />
        <node name="PositionName" value="pos3" />
        <nc_node>
            -- XML CLOB DATA
        </nc_node>
    </node> <!-- Position -->
  </node> <!-- order -->
</node> <!-- nc -->

但是有时,当ncdata列之一超过32KB时,位置会完全丢失。因此,我只有3个职位,而不是3个职位。

我假设XMLTYPE.createxml()的限制为32KB对吗? 它可以在11g中正常工作,并且在Oracle的变更​​日志中找不到任何内容。

是否可以使用一种解决方法,还是必须查询每个位置并将ncdata代码手动添加到我的xml中?

ps .:很抱歉,如果您在“答案”中看到它,则我在错误的制表符中。

最诚挚的问候

1 个答案:

答案 0 :(得分:0)

答案是肯定的,这是一个问题,抛出错误ORA-22813之后,我们可以搜索答案。答案在Oracle Support Ticket 1456531.1中。安装解决方法补丁程序后,我们在XML流或ORA-22813的异常中都没有缺少条目。