Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Oracle XML结果中显示_Xml_Oracle - Fatal编程技术网

在Oracle XML结果中显示

在Oracle XML结果中显示,xml,oracle,Xml,Oracle,我在Oracle11g中使用XMLElement和XMLAgg函数来生成XML字符串。然后将该XML字符串发送到另一个系统进行解析。我想将以下文本附加到XML的结果中 问题是,如果我按原样追加文本,SQL语句将返回以下内容- <ZAVACOR_RESULTS> <TEST> <BATCH> &lt;BATCH_OBJECTS&gt;&lt;ORDER_NUM&gt; 0

我在Oracle11g中使用XMLElement和XMLAgg函数来生成XML字符串。然后将该XML字符串发送到另一个系统进行解析。我想将以下文本附加到XML的结果中

问题是,如果我按原样追加文本,SQL语句将返回以下内容-

    <ZAVACOR_RESULTS>
      <TEST>
        <BATCH>
          &lt;BATCH_OBJECTS&gt;&lt;ORDER_NUM&gt; 0     &lt;/ORDER_NUM&gt;&lt;/BATCH_OBJECTS&gt;
        </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>