在Oracle XML结果中显示
我在Oracle11g中使用XMLElement和XMLAgg函数来生成XML字符串。然后将该XML字符串发送到另一个系统进行解析。我想将以下文本附加到XML的结果中 问题是,如果我按原样追加文本,SQL语句将返回以下内容-在Oracle XML结果中显示,xml,oracle,Xml,Oracle,我在Oracle11g中使用XMLElement和XMLAgg函数来生成XML字符串。然后将该XML字符串发送到另一个系统进行解析。我想将以下文本附加到XML的结果中 问题是,如果我按原样追加文本,SQL语句将返回以下内容- <ZAVACOR_RESULTS> <TEST> <BATCH> <BATCH_OBJECTS><ORDER_NUM> 0
<ZAVACOR_RESULTS>
<TEST>
<BATCH>
<BATCH_OBJECTS><ORDER_NUM> 0 </ORDER_NUM></BATCH_OBJECTS>
</BATCH>
</TEST>
</ZAVACOR_RESULTS>
您需要将固定字符串转换为它自己的XML对象。您尚未显示表结构。如果test.batch是varchar2而不是XMLType,则可以转换案例的结果:
SELECT
XMLElement("ZAVACOR_RESULTS",
XMLAgg(
XMLElement("TEST",
XMLElement("BATCH", xmltype(case when t.batch is NULL then '<BATCH_OBJECTS> <ORDER_NUM> 0 </ORDER_NUM></BATCH_OBJECTS>' else t.batch end)),
...
无论哪种方式,它们都会给出:
XML
-------------------------------------------------------
<ZAVACOR_RESULTS><TEST><BATCH><BATCH_OBJECTS>
<ORDER_NUM> 0 </ORDER_NUM>
</BATCH_OBJECTS>
</BATCH></TEST></ZAVACOR_RESULTS>
使用XMLSerialise只是为了整齐地显示;要传递到另一个应用程序,可以使用getClobVal:
如果要将多个测试合并到一个XML文档中,可以使用另一个级别的XMLAgg:
我已经包含了一些属性来区分源行:
<ZAVACOR_RESULTS>
<TEST TEST_NUMBER="4537048">
<BATCH>
<BATCH_OBJECTS>
<ORDER_NUMBER>0</ORDER_NUMBER>
</BATCH_OBJECTS>
</BATCH>
</TEST>
<TEST TEST_NUMBER="4537049">
<BATCH BATCH="BATCH_1">
<BATCH_OBJECTS>
<ORDER_NUMBER>12345</ORDER_NUMBER>
<ORDER_NUMBER>23456</ORDER_NUMBER>
</BATCH_OBJECTS>
</BATCH>
</TEST>
</ZAVACOR_RESULTS>
.对不起,我在设置问题的格式时遇到问题。我希望我的结果看起来像-0,我想你已经使它变得比需要的更复杂了,但是没有更多的样本输入和输出,我不确定。中间的子查询看起来很奇怪,如果有真实数据,元素的嵌套看起来也很奇怪。我也可能会使用nvl而不是case,因为它比较短。谢谢Alex的回复。TEST.BATCH是一个varchar2。如果使用XMLType函数,当TEST.BATCH为null时,将获得所需的输出。但是,如果TEST.BATCH返回一个值,则会出现oracle解析错误ORA-31011、ORA-19202和ORA-06512。我可以解决这个问题吗?同样,您还没有显示任何示例数据。该错误表明批处理列不包含XML样式的代码段。那么你到底想在这里做什么?如果批处理为空-这是否意味着没有批处理对象记录?关系不清楚。我试图解决的真正问题是,如果TEST.BATCH为NULL,则从BATCH\u对象中选择order\u number之后的整个块也为空,因为TEST.BATCH=BATCH\u OBJECTS.BATCH。这就是我尝试附加XML字符串0的原因。
SELECT
XMLElement("ZAVACOR_RESULTS",
XMLAgg(
XMLElement("TEST",
XMLElement("BATCH", xmltype(case when t.batch is NULL then '<BATCH_OBJECTS> <ORDER_NUM> 0 </ORDER_NUM></BATCH_OBJECTS>' else t.batch end)),
...
SELECT
XMLElement("ZAVACOR_RESULTS",
XMLAgg(
XMLElement("TEST",
XMLElement("BATCH", case when t.batch is NULL then xmltype('<BATCH_OBJECTS> <ORDER_NUM> 0 </ORDER_NUM></BATCH_OBJECTS>') else t.batch end),
...
XML
-------------------------------------------------------
<ZAVACOR_RESULTS><TEST><BATCH><BATCH_OBJECTS>
<ORDER_NUM> 0 </ORDER_NUM>
</BATCH_OBJECTS>
</BATCH></TEST></ZAVACOR_RESULTS>
SELECT XMLSerialize(CONTENT
XMLElement("ZAVACOR_RESULTS",
XMLElement("TEST",
XMLElement("BATCH",
XMLElement("BATCH_OBJECTS",
XMLAgg(
XMLElement("ORDER_NUMBER", nvl(bo.ORDER_NUMBER, 0))
)
)
)
)
) INDENT SIZE = 2
) as XML
FROM TEST T
LEFT JOIN BATCH_OBJECTS bo ON bo.BATCH = t.BATCH
WHERE t.SAMPLE_NUMBER = 705000088556
AND t.test_number = 4537048;
<ZAVACOR_RESULTS>
<TEST>
<BATCH>
<BATCH_OBJECTS>
<ORDER_NUMBER>0</ORDER_NUMBER>
</BATCH_OBJECTS>
</BATCH>
</TEST>
</ZAVACOR_RESULTS>
<ZAVACOR_RESULTS>
<TEST>
<BATCH>
<BATCH_OBJECTS>
<ORDER_NUMBER>12345</ORDER_NUMBER>
<ORDER_NUMBER>23456</ORDER_NUMBER>
</BATCH_OBJECTS>
</BATCH>
</TEST>
</ZAVACOR_RESULTS>
SELECT XMLSerialize(CONTENT
XMLElement("ZAVACOR_RESULTS",
XMLAgg(
XMLElement("TEST", XMLAttributes(t.TEST_NUMBER),
XMLElement("BATCH", XMLAttributes(t.BATCH),
XMLElement("BATCH_OBJECTS",
XMLAgg(
XMLElement("ORDER_NUMBER", nvl(bo.ORDER_NUMBER, 0))
)
)
)
)
)
) INDENT SIZE = 2
) as XML
FROM TEST T
LEFT JOIN BATCH_OBJECTS bo ON bo.BATCH = t.BATCH
GROUP BY t.TEST_NUMBER, t.BATCH;
<ZAVACOR_RESULTS>
<TEST TEST_NUMBER="4537048">
<BATCH>
<BATCH_OBJECTS>
<ORDER_NUMBER>0</ORDER_NUMBER>
</BATCH_OBJECTS>
</BATCH>
</TEST>
<TEST TEST_NUMBER="4537049">
<BATCH BATCH="BATCH_1">
<BATCH_OBJECTS>
<ORDER_NUMBER>12345</ORDER_NUMBER>
<ORDER_NUMBER>23456</ORDER_NUMBER>
</BATCH_OBJECTS>
</BATCH>
</TEST>
</ZAVACOR_RESULTS>