2010-02-04 4 views
6

W SQL Server jest łatwy do analizowania zmiennej vachar który zawiera prostą XML fragment zbudowany z atrybutami i załadować go do tabeli temp - patrz poniższy przykład:Jak analizować prosty fragment kodu XML w Oracle PL/SQL i załadować go do globalnej tabeli tymczasowej?

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 

Czy istnieje prosty przykład, który robi równowartość tego w Oracle PL/SQL?

W Oracle istnieje pakiet DBMS_XMLSTORE, ale chce fragmentu XML w określonym kanonicznym formacie, używając elementów ROWSET i ROW. DBMS_XMLSTORE nie działa z atrybutami XML.

Ponadto, nie jestem w 100% pewien, czy muszę utworzyć XSD z mojego fragmentu XML i zarejestrować go w bazie danych Oracle, zanim będę mógł użyć dowolnego z innych narzędzi/zapytań XML/XML PL/SQL.

Dzięki!

Odpowiedz

8

Wdrożenie bazy danych Oracle w Javie ma naprawdę oszałamiającą liczbę opcji i nie zawsze jest jasne (przynajmniej dla mnie), które z nich stosuje się w danym scenariuszu. W tym konkretnym przypadku pożądanym jest XMLTable(), który zamienia XQuery w zestaw wierszy.

Najpierw tworzymy stół.

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

Table created. 

SQL> 

Następnie wypełnić go ...

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> 

Wreszcie udowodnimy to działało ....

SQL> select * from t23 
    2/

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

SQL> 
+0

+1. Bardzo prawdziwe. Jest tak wiele opcji i nie wiesz, który z nich pasuje do którego. – Guru

Powiązane problemy