【问题标题】:Limitations XMLAgg or XMLStyle.createxml()限制 XMLAgg 或 XMLStyle.createxml()
【发布时间】:2019-09-23 20:50:49
【问题描述】:

我上个月切换到 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 时,位置会完全丢失。所以我只有 2 个职位,而不是 3 个职位。

当我假设 XMLTYPE.createxml() 有 32KB 的限制时,我是对的吗? 它在 11g 中运行没有问题,我在 Oracle 的更新日志中找不到任何内容。

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

ps.:对不起,如果您在答案中阅读它,我在错误的选项卡中。

最好的问候

【问题讨论】:

    标签: xml oracle oracle12c


    【解决方案1】:

    答案是肯定的,有一个问题,在抛出错误 ORA-22813 后,我们可以搜索 ansers。 Oracle Support Ticket 1456531.1 就是答案。安装 Workaround Patch 后,我们不会在 XML 流中丢失条目或出现 ORA-22813 异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      • 2014-07-26
      • 1970-01-01
      • 2019-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多