2009-10-21 5 views
2

Voici un exemple de TSQL que je voudrais réécrire en PL/SQL.Comment "ouvrir" des données XML dans Oracle

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 

Quelqu'un peut-il me donner une direction ici.

Répondre

3

deux méthodes sont décrites dans ce SO:

Oracle Pl/SQL: Loop through XMLTYPE nodes

Mise à jour: il est assez simple puisque les deux méthodes sont SQL pures (vous pouvez appeler cette SQL de PL/SQL ou tout autre outil que interagit avec la base de données):

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

Hi Vincent. C'était un bon lien (+1) mais je n'en sais pas assez pour voir comment les réponses là-bas résolvent mon problème. Il y a deux réponses. L'une est une solution SQL Plus et l'autre est une solution PLSQL mais elle utilise quelque chose appelé XMLTYPE sans donner de réponse complète. Si j'en savais plus, cela aurait probablement résolu ça pour moi. – wcm

+0

@wcm: Je ne connais pas grand chose à propos de SQL Server mais dans cet exemple, le synthax ressemble beaucoup à Oracle. nodes = XMLSequence + extract - value = extraire la valeur –

+0

Vous devez comprendre que MS vole le plus possible d'Oracle: o). Dans TSQL, vous avez tendance à diviser vos solutions en différentes étapes. Il semble que dans Oracle, vous essayez de tout faire en un seul select. Dans mon code, je déclare @xml comme type de données XML, puis je définis la valeur puis j'utilise la valeur dans mon select. Votre code crée le XMLTYPE explicitement dans le corps du select. La solution Oracle est probablement plus efficace mais je pense que le TSQL est plus facile à lire et à comprendre. C'était une excellente réponse. J'aimerais pouvoir vous voter plus d'une fois. – wcm

Questions connexes