【发布时间】: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.:对不起,如果您在答案中阅读它,我在错误的选项卡中。
最好的问候
【问题讨论】: