Я перешел на 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?
пс: Извините, если вы прочитали это в ответе, я попал не в ту вкладку.
С наилучшими пожеланиями