2009-10-21 67 views
2

以下是一些我想在PL/SQL中重寫的TSQL示例。如何在Oracle中「打開」XML數據

DECLARE @xml XML 

SET @xml = '<theRange> 
    <theRow><First>Bob</First><Last>Smith</Last><Age>30</Age></theRow> 
    <theRow><First>Sue</First><Last>Jones</Last><Age>34</Age></theRow> 
    <theRow><First>John</First><Last>Bates</Last><Age>40</Age></theRow> 
</theRange>' 

;WITH OpenedXML AS (
    SELECT r.value('First[1]','varchar(50)') AS First, 
     r.value('Last[1]','varchar(50)') AS Last, 
     r.value('Age[1]','int') AS Age 
    FROM @xml.nodes('//theRange/theRow') AS Row(r) 
) 
SELECT * 
FROM OpenedXML 
WHERE Age BETWEEN 30 AND 35 

任何人都可以給我一些方向。

回答

3

兩個方法在這個SO描述:

Oracle Pl/SQL: Loop through XMLTYPE nodes

更新:這是相當簡單的,因爲這兩種方法都是純SQL(你可以調用這個SQL在PL/SQL或任何工具與數據庫交互):

SQL> WITH openedXml AS (
    2 SELECT extractvalue(column_value, '/theRow/First') FIRST, 
    3   extractvalue(column_value, '/theRow/Last') LAST, 
    4   to_number(extractvalue(column_value, '/theRow/Age')) Age 
    5 FROM TABLE(XMLSequence(XMLTYPE('<theRange> 
    6  <theRow><First>Bob</First><Last>Smith</Last><Age>30</Age></theRow> 
    7  <theRow><First>Sue</First><Last>Jones</Last><Age>34</Age></theRow> 
    8  <theRow><First>John</First><Last>Bates</Last><Age>40</Age></theRow> 
    9 </theRange>').extract('/theRange/theRow'))) 
10 ) 
11 SELECT * 
12 FROM openedxml 
13 WHERE age BETWEEN 30 AND 35; 

FIRST  LAST  AGE 
--------- -------- ----- 
Bob  Smith  30 
Sue  Jones  34 
+0

嗨文森特。這是一個很好的鏈接(+1),但我不知道該如何解決我的問題。有兩個答覆。一個是SQL Plus解決方案,另一個是PLSQL解決方案,但它使用的是XMLTYPE而沒有給出完整的答案。如果我知道更多,那可能會爲我解決它。 – wcm 2009-10-21 20:48:16

+0

@wcm:我不太瞭解SQL Server,但在這個例子中,synthax看起來很像Oracle。節點= XMLSequence +解壓縮 - 值= extractvalue – 2009-10-21 21:59:19

+0

雅必須明白,MS儘可能地從Oracle中竊取:o)。在TSQL中,您傾向於將解決方案分成不同的步驟。看起來,在Oracle中,你嘗試在單一選擇中做所有事情。在我的代碼中,我將@xml聲明爲XML數據類型,然後設置該值,然後使用我選擇的值。您的代碼在select的主體中顯式創建XMLTYPE。 Oracle解決方案可能更高效,但我認爲TSQL更易於閱讀和理解。這是一個很好的答案。我希望我能不止一次地投票給你。 – wcm 2009-10-22 18:04:33