oracle plsql: comment analyser XML et insérer dans une table
comment charger un fichier xml imbriqué dans une table de base de données ?
<?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>
dans ce xml, la personne est le nom de la table , le nom est le nom déposé, Tom est sa valeur déposée. L'adresse est une adresse subtable et l'état et la ville sont deux colonnes à L'intérieur de L'adresse. Je veux insérer la personne en ligne dans la table personne, si elle a échoué , ne pas insérer dans la table d'adresses. Ce xml pourrait être très grand. Quelle est la meilleure solution pour cela ?
4 réponses
Vous pouvez charger un document XML dans un XMLType, puis l'interroger, par exemple:
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;
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;
vous aurez besoin d'écrire beaucoup de code pour traiter des fichiers XML Complexes avec Oracle. Si vous avez des volumes importants de XML alors la performance peut être une préoccupation aussi. Les analyseurs XML de niveau d'entreprise vous permettront de traiter de grands volumes de fichiers XML complexes dans un format relationnel sans écrire de code. Ce blog montre comment charge en vrac des fichiers XML complexes à Oracle sans écrire de code