2010-02-04 4 views
6

Dans SQL Server, il est facile d'analyser une variable vachar qui contient simple extrait de XML construit avec des attributs et le charger dans une table temporaire - voir exemple ci-dessous:Comment analyser un extrait XML simple dans Oracle PL/SQL et le charger dans une table temporaire globale?

declare @UpdateXML VARCHAR(8000) 

set @UpdateXML='<ArrayOfRecords> 
    <Record Field01="130" Field02="1700" Field03="C" /> 
    <Record Field01="131" Field02="1701" Field03="C" /> 
    <Record Field01="132" Field02="1702" Field03="C" /> 
</ArrayOfRecords>' 

DECLARE @hdoc int 

EXEC sp_xml_preparedocument @hdoc OUTPUT, @UpdateXML 

INSERT 
INTO #tblTemp( 
    [Field01], 
    [Field02], 
    [Field03] 
) 
SELECT * 
FROM OPENXML(@hdoc, '//ArrayOfRecords/Record') 
WITH (Field01 int, 
    Field02 int, 
    Field03 char(1) 
) 

EXEC sp_xml_removedocument @hdoc 

est-il un exemple simple qui fait l'équivalent de cela dans Oracle PL/SQL?

Dans Oracle, il existe un package DBMS_XMLSTORE mais il souhaite que l'extrait XML soit dans un format canonique spécifique à l'aide des éléments ROWSET et ROW. DBMS_XMLSTORE ne semble pas fonctionner avec les attributs XML. De plus, je ne suis pas sûr à 100% si je dois créer un XSD de mon extrait XML et l'enregistrer sur la base de données Oracle avant de pouvoir utiliser l'un des autres outils/requêtes XML PL/SQL.

Merci!

Répondre

8

La mise en œuvre de la base de données XML d'Oracle a un nombre franchement ahurissant d'options, et il n'est pas toujours clair (du moins pour moi) que l'on applique dans un scénario donné. Dans ce cas particulier, celui que vous voulez est XMLTable(), ce qui transforme un XQuery en un ensemble de lignes.

D'abord, nous créons une table.

SQL> create table t23 
    2  (field01 number 
    3  , field02 number 
    4  , field03 char(1) 
    5  ) 
    6/

Table created. 

SQL> 

Ensuite, nous le remplir ...

SQL> declare 
    2  x varchar2(2000) := '<ArrayOfRecords> 
    3      <Record Field01="130" Field02="1700" Field03="C" /> 
    4      <Record Field01="131" Field02="1701" Field03="C" /> 
    5      <Record Field01="132" Field02="1702" Field03="C" /> 
    6     </ArrayOfRecords>'; 
    7 begin 
    8  insert into t23 
    9  select * 
10  from xmltable 
11   ('/ArrayOfRecords/Record' 
12    passing xmltype (x) 
13    columns f1 number path '@Field01' 
14      , f2 number path '@Field02' 
15      , f3 char(1) path '@Field03' 
16   ) 
17  ; 
18 end; 
19/

PL/SQL procedure successfully completed. 

SQL> 

Enfin, nous le prouver .... travaillé

SQL> select * from t23 
    2/

    FIELD01 FIELD02 F 
---------- ---------- - 
     130  1700 C 
     131  1701 C 
     132  1702 C 

SQL> 
+0

+1. Très vrai. Il y a tellement d'options et vous ne savez pas lequel correspond. – Guru

Questions connexes