Ограничения XMLAgg или XMLStyle.createxml () - PullRequest
2 голосов
/ 06 мая 2019

Я перешел на 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 может иметь размер 4 ГБ, поэтому он будет обрабатывать мой сгенерированный код, который иногда очень велик.

Когда я выполняю этот запрос:

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 превышает 32 КБ. Так что вместо 3 позиций у меня просто 2.

Прав ли я, когда я предполагаю, что ограничение XMLTYPE.createxml () составляет 32 КБ? Он работал в 11g без проблем, и я ничего не могу найти в списке изменений Oracle.

Есть ли обходной путь, который я могу использовать, или мне нужно запрашивать каждую позицию и вручную добавлять код ncdata в мой xml?

пс: Извините, если вы прочитали это в ответе, я попал не в ту вкладку.

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 13 мая 2019

Ответ - да, есть проблема, и после того, как ошибка ORA-22813 была выдана, мы могли искать ansers.В Oracle Support Ticket 1456531.1 это ответ.После установки исправления у нас не будет пропущенных записей в потоке XML или исключении с ORA-22813.

...