从Oracle中的表中检索XML数据

时间:2016-12-01 17:02:01

标签: xml oracle

我不认为我想要达到的目标就是达到这个目标。

我只是尝试将一个XML字符串传递给一个过程,将其转换为一个表并在查询中使用它,但我在将XML转换为表时遇到了问题。

到目前为止,这就是我所拥有的

DECLARE
  xmlVar CLOB := '<DocumentElement><XML_Result><GSID>22271</GSID><FROMCITY>LAREDO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78040</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>RAMOSARIZPE</TOCITY><TOSTATE>CU</TOSTATE><TOPOSTAL>25000</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>194.9</TOTALMILES></XML_Result></DocumentElement>';
BEGIN

with routes AS (
  Select extractvalue(column_value, '/XML_Result/GSID') GSID,
      extractvalue(column_value, '/XML_Result/FROMCITY') FROMCITY,
      extractvalue(column_value, '/XML_Result/FROMSTATE') FROMSTATE,
      extractvalue(column_value, '/XML_Result/FROMPOSTAL') FROMPOSTAL,
      extractvalue(column_value, '/XML_Result/FROMCOUNTRY') FROMCOUNTRY,
      extractvalue(column_value, '/XML_Result/TOCITY') TOCITY,
      extractvalue(column_value, '/XML_Result/TOSTATE') TOSTATE,
      extractvalue(column_value, '/XML_Result/TOPOSTAL') TOPOSTAL,
      extractvalue(column_value, '/XML_Result/TOCOUNTRY') TOCOUNTRY,
      extractvalue(column_value, '/XML_Result/TOTALMILES') TOTALMILES
  FROM TABLE(XMLSequence(XMLTYPE(xmlVar).extract('//XML_Result')))
) Select * from routes ;

END;

我认为这应该有效。我也测试了

declare
     xmlClob CLOB;
begin

  xmlClob := '<DocumentElement><XML_Result><GSID>22271</GSID><FROMCITY>LAREDO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78040</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>RAMOSARIZPE</TOCITY><TOSTATE>CU</TOSTATE><TOPOSTAL>25000</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>194.9</TOTALMILES></XML_Result></DocumentElement>';

  Select * from xmltable(
    '//XML_Result'
    PASSING xmltype.createxml(xmlClob)
    COLUMNS GSID VARCHAR(100) PATH 'GSID',
      FROMCITY VARCHAR(100) PATH 'FROMCITY',
      FROMSTATE VARCHAR(100) PATH 'FROMSTATE',
      FROMPOSTAL VARCHAR(100) PATH 'FROMPOSTAL',
      FROMCOUNTRY VARCHAR(100) PATH 'FROMCOUNTRY',
      TOCITY VARCHAR(100) PATH 'TOCITY',
      TOSTATE VARCHAR(100) PATH 'TOSTATE',
      TOPOSTAL VARCHAR(100) PATH 'TOPOSTAL',
      TOCOUNTRY VARCHAR(100) PATH 'TOCOUNTRY',
      TOTALMILES VARCHAR(100) PATH 'TOTALMILES') xms;

end;

两个代码都返回此错误

  

PLS-00428:此SELECT语句中需要一个INTO子句   06550. 00000 - &#34;行%s,列%s:\ n%s&#34;   *原因:通常是PL / SQL编译错误。   *操作:

但我不知道怎么做到这一点。此外,我无法创建一个表,也不能创建一个临时表,客户限制了我能够做的很多事情。

任何实现我预期结果的想法?

PS:xml是我正在使用

的一小部分

编辑:

我刚试过这个

with routes AS (
  Select extractvalue(column_value, '/XML_Result/GSID') GSID,
      extractvalue(column_value, '/XML_Result/FROMCITY') FROMCITY,
      extractvalue(column_value, '/XML_Result/FROMSTATE') FROMSTATE,
      extractvalue(column_value, '/XML_Result/FROMPOSTAL') FROMPOSTAL,
      extractvalue(column_value, '/XML_Result/FROMCOUNTRY') FROMCOUNTRY,
      extractvalue(column_value, '/XML_Result/TOCITY') TOCITY,
      extractvalue(column_value, '/XML_Result/TOSTATE') TOSTATE,
      extractvalue(column_value, '/XML_Result/TOPOSTAL') TOPOSTAL,
      extractvalue(column_value, '/XML_Result/TOCOUNTRY') TOCOUNTRY,
      extractvalue(column_value, '/XML_Result/TOTALMILES') TOTALMILES
  FROM TABLE(XMLSequence(XMLTYPE('<DocumentElement><XML_Result><GSID>22271</GSID><FROMCITY>LAREDO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78040</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>RAMOSARIZPE</TOCITY><TOSTATE>CU</TOSTATE><TOPOSTAL>25000</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>194.9</TOTALMILES></XML_Result><XML_Result><GSID>24102</GSID><FROMCITY>DELRIO</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78840</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>REYNOSA</TOCITY><TOSTATE>TM</TOSTATE><TOPOSTAL>88787</TOPOSTAL><TOCOUNTRY>MX</TOCOUNTRY><TOTALMILES>325.4</TOTALMILES></XML_Result><XML_Result><GSID>23131</GSID><FROMCITY>BROWNSVL</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78521</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>EAGLEPS</TOCITY><TOSTATE>TX</TOSTATE><TOPOSTAL>78852</TOPOSTAL><TOCOUNTRY>US</TOCOUNTRY><TOTALMILES>326.3</TOTALMILES></XML_Result><XML_Result><GSID>21011</GSID><FROMCITY>EAGLEPS</FROMCITY><FROMSTATE>TX</FROMSTATE><FROMPOSTAL>78852</FROMPOSTAL><FROMCOUNTRY>US</FROMCOUNTRY><TOCITY>BROWNSVL</TOCITY><TOSTATE>TX</TOSTATE><TOPOSTAL>78521</TOPOSTAL><TOCOUNTRY>US</TOCOUNTRY><TOTALMILES>326.2</TOTALMILES></XML_Result></DocumentElement>').extract('//XML_Result')))
) Select * from routes;

我实现了我的意图,因为我正在获得一个表,我可以在子查询中查询另外几个表,但问题是,XML不会这么短。我当前的xml字符串长度超过4000个字符,因此我需要将其存储到变量中才能完全使用它。

我想,也许,一次发送XML块,5个寄存器,然后用每个XML块执行查询,然后用C#将结果追加到我的DataTable中,但我宁愿发送整个XML一次并获得整个响应

0 个答案:

没有答案