read - oracle plsql: cómo analizar XML e insertarlo en la tabla
read xml oracle (4)
¿Cómo cargar un archivo xml anidado en la tabla de la base de datos?
<?xml version="1.0" ?>
<person>
<row>
<name>Tom</name>
<Address>
<State>California</State>
<City>Los angeles</City>
</Address>
</row>
<row>
<name>Jim</name>
<Address>
<State>California</State>
<City>Los angeles</City>
</Address>
</row>
</person>
En este xml, la persona es el nombre de la tabla, el nombre es el nombre archivado, Tom es su valor registrado. La dirección es una subtabla y el estado y la ciudad son dos columnas dentro de la dirección. Quiero insertar la fila de personas en la tabla de personas, si falló, no las inserte en la tabla de direcciones. Este xml podría ser muy grande. ¿Cuál es la mejor solución para hacer esto?
Puede cargar un documento XML en un XMLType y luego consultarlo, por ejemplo:
DECLARE
x XMLType := XMLType(
''<?xml version="1.0" ?>
<person>
<row>
<name>Tom</name>
<Address>
<State>California</State>
<City>Los angeles</City>
</Address>
</row>
<row>
<name>Jim</name>
<Address>
<State>California</State>
<City>Los angeles</City>
</Address>
</row>
</person>'');
BEGIN
FOR r IN (
SELECT ExtractValue(Value(p),''/row/name/text()'') as name
,ExtractValue(Value(p),''/row/Address/State/text()'') as state
,ExtractValue(Value(p),''/row/Address/City/text()'') as city
FROM TABLE(XMLSequence(Extract(x,''/person/row''))) p
) LOOP
-- do whatever you want with r.name, r.state, r.city
END LOOP;
END;
Tendrá que escribir una gran cantidad de código para procesar archivos XML complejos con Oracle. Si tiene grandes volúmenes de XML, el rendimiento también puede ser una preocupación. Los analizadores XML de nivel empresarial le permitirán procesar grandes volúmenes de archivos XML complejos en un formato relacional sin escribir ningún código. Esta publicación de blog muestra cómo cargar de forma masiva archivos XML complejos a Oracle sin escribir ningún código
select *
FROM XMLTABLE(''/person/row''
PASSING
xmltype(''
<person>
<row>
<name>Tom</name>
<Address>
<State>California</State>
<City>Los angeles</City>
</Address>
</row>
<row>
<name>Jim</name>
<Address>
<State>California</State>
<City>Los angeles</City>
</Address>
</row>
</person>
'')
COLUMNS
--describe columns and path to them:
name varchar2(20) PATH ''./name'',
state varchar2(20) PATH ''./Address/State'',
city varchar2(20) PATH ''./Address/City''
) xmlt
;
CREATE OR REPLACE PROCEDURE ADDEMP
(xml IN CLOB)
AS
BEGIN
INSERT INTO EMPLOYEE (EMPID,EMPNAME,EMPDETAIL,CREATEDBY,CREATED)
SELECT
ExtractValue(column_value,''/ROOT/EMPID'') AS EMPID
,ExtractValue(column_value,''/ROOT/EMPNAME'') AS EMPNAME
,ExtractValue(column_value,''/ROOT/EMPDETAIL'') AS EMPDETAIL
,ExtractValue(column_value,''/ROOT/CREATEDBY'') AS CREATEDBY
,ExtractValue(column_value,''/ROOT/CREATEDDATE'') AS CREATEDDATE
FROM TABLE(XMLSequence( XMLType(xml))) XMLDUMMAY;
COMMIT;
END;