recorrer read leer ejemplos descomponer archivos 10g xml oracle parsing plsql

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>