2016-12-01 34 views
0

我不認爲我想達到的是dar提取。從Oracle中檢索數據作爲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:INTO子句預計在SELECT語句 06550. 00000 - 「行%S,列%S:\ n%s「 *原因:通常是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; 

我實現我的本意,我」 m得到一個表,我可以在另一個表中查詢子查詢,但問題是,XML不會這麼短。我當前的xml字符串長度超過4000個字符,所以我需要將它存儲到一個變量中,以便能夠完全使用它。我想,也許,一次發送的XML,5個寄存器的塊,並執行與每個XML塊的查詢,然後將結果附加到我的DataTable在C#中,但我寧願只發送整個XML一次並得到整個響應

回答

0

該錯誤與XML無關:從PLSQL塊內,您不能執行select ... from ...,但您需要將結果提取到某個變量中。

例如:

SQL> select 1 from dual; 

     1 
---------- 
     1 

SQL> begin 
    2  select 1 from dual; 
    3 end; 
    4/
    select 1 from dual; 
    * 
ERROR at line 2: 
ORA-06550: line 2, column 5: 
PLS-00428: an INTO clause is expected in this SELECT statement 


SQL> declare 
    2  vN number; 
    3 begin 
    4  select 1 into vN from dual; 
    5  dbms_output.put_line(vN); 
    6 end; 
    7/
1 

PL/SQL procedure successfully completed. 

SQL> 
+0

好吧,我不能把它存儲在一個變量,我需要它以表格的形式,我不能因客戶端的限制 – CJLopez

+0

那麼你應該怎麼做與創建表結果?你需要將它假脫機到一個文件,返回一些輸出參數,...? – Aleksej

+0

我需要從這個XML中獲取一個表以便在另一個子查詢中使用。我更新了我的問題,以便更深入地瞭解我的意圖 – CJLopez