2010-06-29 58 views
0

我有一個非常簡單的XML文檔,它作爲VARCHAR2存儲在Oracle 10g表中。以下是XML的一個例子。我想採用XML並將其作爲單個記錄插入到全局臨時表中。我看過一些與這個話題有關的其他問題,但他們比我需要的複雜一點。任何人都告訴我如何從這個XML中獲取數據?謝謝在Oracle函數中解析XML

<Document> 
    <A1> 
    <D1>dzzz</D1> 
    <P1>pzzz</P1> 
    <AA1>abcd</AA1> 
    <PP1>TEMP</PP1> 
    <Desc>TEMP DESC</Desc> 
    <Price>1.81568</Price> 
    <Qty>278</Qty> 
    <Location>E</Location> 
    </A1> 
</Document> 
+0

我看到您的文章沒有XML? – Frank 2010-06-29 18:47:12

+0

Oooppps ...我把它放在那裏,但一定是做到了。你如何在問題中插入XML? – MikeTWebb 2010-06-29 18:48:11

回答

1

您可以將臨時表中的列定義爲XMLType列。

CREATE TABLE EXAMPLE_XML_TABLE 
(
    XML_DATA XMLType 
); 

一旦你有了列,你可以添加字符串(爲了便於閱讀,添加了空格)。

INSERT INTO EXAMPLE_XML_TABLE VALUES(
    XMLType('<Document> 
       <A1> 
        <D1>dzzz</D1> 
        <P1>pzzz</P1> 
        <AA1>abcd</AA1> 
        <PP1>TEMP</PP1> 
        <Desc>TEMP DESC</Desc> 
        <Price>1.81568</Price> 
        <Qty>278</Qty> 
        <Location>E</Location> 
       </A1> 
      </Document>') 
    ); 

然後,您可以使用SQL來查詢XML中的數據。

SELECT EXTRACT(XML_DATA, '/Document/A1/D1') D1, 
     EXTRACT(XML_DATA, '/Document/A1/P1') P1, 
     EXTRACT(XML_DATA, '/Document/A1/AA1') AA1, 
     EXTRACT(XML_DATA, '/Document/A1/PP1') PP1, 
     EXTRACT(XML_DATA, '/Document/A1/Desc') DESC, 
     EXTRACT(XML_DATA, '/Document/A1/Price') PRICE, 
     EXTRACT(XML_DATA, '/Document/A1/Qty') QTY, 
     EXTRACT(XML_DATA, '/Document/A1/Location') LOCATION, 
FROM EXAMPLE_XML_TABLE; 
+0

這太好了,謝謝! – MikeTWebb 2010-06-30 17:19:39

0

通過

我想利用XML和插入 到一個全局臨時表作爲一個 記錄

我假設你要插入的元素在A1節點上作爲單行數據。如果是這樣,那麼你就可以做到的是像這樣的東西:

insert into temp_table_name 
select extractvalue(T.COLUMN_VALUE, '/A1/D1'), 
     extractvalue(T.COLUMN_VALUE, '/A1/P1'), 
     extractvalue(T.COLUMN_VALUE, '/A1/AA1'), 
     extractvalue(T.COLUMN_VALUE, '/A1/PP1'), 
     extractvalue(T.COLUMN_VALUE, '/A1/Desc'), 
     extractvalue(T.COLUMN_VALUE, '/A1/Price'), 
     extractvalue(T.COLUMN_VALUE, '/A1/Qty'), 
     extractvalue(T.COLUMN_VALUE, '/A1/Location') 
from 
table(xmlsequence(extract(xmltype('<Document> 
    <A1> 
    <D1>dzzz</D1> 
    <P1>pzzz</P1> 
    <AA1>abcd</AA1> 
    <PP1>TEMP</PP1> 
    <Desc>TEMP DESC</Desc> 
    <Price>1.81568</Price> 
    <Qty>278</Qty> 
    <Location>E</Location> 
    </A1> 
</Document>'), '/Document/A1'))) T 

可選,解壓到PriceQty的號碼,你可以這樣做:

extract(T.COLUMN_VALUE, '/A1/Price/text()').getNumberVal() 
extract(T.COLUMN_VALUE, '/A1/Qty/text()').getNumberVal() 
+0

太棒了... tahnks! – MikeTWebb 2010-06-30 17:19:23