oracle plsql:如何解析 XML 并插入到表中
Posted
技术标签:
【中文标题】oracle plsql:如何解析 XML 并插入到表中【英文标题】:oracle plsql: how to parse XML and insert into table 【发布时间】:2012-10-10 13:35:12 【问题描述】:如何将嵌套的 xml 文件加载到数据库表中?
<?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>
在这个xml中,person是表名,name是文件名,Tom是它的文件值。 地址是一个子表,州和城市是地址内的两列。我想将人员行插入人员表,如果失败,请不要插入地址表。这个 xml 可能非常大。这样做的最佳解决方案是什么?
【问题讨论】:
试试这个forums.oracle.com/forums/thread.jspa?messageID=10269899 我有一点不同的 xml 树,请帮助 :) ***.com/questions/18583872/… 【参考方案1】:您可以将 XML 文档加载到 XMLType 中,然后对其进行查询,例如:
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;
【讨论】:
这可能会有所帮助,但一个大问题是我可能不知道标签名称,输入是具有所有不同表名和文件的动态 xml 嗯,你需要知道标签是什么,否则代码怎么知道在哪里插入数据? 我已经通过使用 dbms_xmldom API 解决了这个问题。感谢您的帮助【参考方案2】: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;
【讨论】:
【参考方案3】: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
;
【讨论】:
当我在以上是关于oracle plsql:如何解析 XML 并插入到表中的主要内容,如果未能解决你的问题,请参考以下文章