read - ¿Cómo se analiza un fragmento XML simple en Oracle PL/SQL y se carga en una tabla temporal global?
recorrer xmltype oracle (1)
En SQL Server es fácil analizar una variable de vachar que contiene un fragmento XML simple construido con atributos y cargarlo en una tabla temporal; consulte el siguiente ejemplo:
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
¿Hay un ejemplo simple que haga el equivalente de esto en Oracle PL / SQL?
En Oracle hay un paquete DBMS_XMLSTORE pero quiere el fragmento XML en un formato canónico específico utilizando los elementos ROWSET y ROW. DBMS_XMLSTORE no parece funcionar con atributos XML.
Además, no estoy 100% seguro de si necesito crear un XSD de mi fragmento XML y registrarlo en la base de datos de Oracle antes de que pueda utilizar cualquiera de las otras herramientas / consultas PL / SQL XML.
¡Gracias!
La implementación XML DB de Oracle tiene una cantidad francamente desconcertante de opciones, y no siempre es claro (al menos para mí) cuál se aplica en cualquier escenario dado. En este caso particular, el que desea es XMLTable () , que convierte un XQuery en un conjunto de filas.
Primero creamos una tabla.
SQL> create table t23
2 (field01 number
3 , field02 number
4 , field03 char(1)
5 )
6 /
Table created.
SQL>
Luego lo poblamos ...
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>
Finalmente demostramos que funcionó ...
SQL> select * from t23
2 /
FIELD01 FIELD02 F
---------- ---------- -
130 1700 C
131 1701 C
132 1702 C
SQL>