我有一个定义如下的表
CREATE TABLE "MENU"."ITEMS" (
"ID" NUMBER NOT NULL ENABLE,
"PARENT" NUMBER DEFAULT 0 NOT NULL ENABLE,
"OPID" NUMBER DEFAULT 0 NOT NULL ENABLE,
"VER" NUMBER DEFAULT 0 NOT NULL ENABLE,
"STATUS" NUMBER DEFAULT 0 NOT NULL ENABLE,
"RECORD_TIME" TIMESTAMP (9) WITH LOCAL TIME ZONE DEFAULT systimestamp NOT NULL ENABLE,
"MODIFIED_TIME" TIMESTAMP (6) DEFAULT systimestamp NOT NULL ENABLE,
"VALUE" VARCHAR2(255 BYTE) NOT NULL ENABLE,
"TITLE" VARCHAR2(255 BYTE)
)
使用 XMLGEN
我创建了一个 xml,如下所示
<?xml version="1.0" ?>
<MENU ENCODE="0">
<ITEM VALUE="1" TITLE="test1">
<ITEM VALUE="1" TITLE="test10"/>
<ITEM VALUE="2" TITLE="test11"/>
<ITEM VALUE="3" TITLE="test12"/>
</ITEM>
<ITEM VALUE="2" TITLE="test2" >
<ITEM VALUE="1" TITLE="test21"/>
<ITEM VALUE="2" TITLE="test22"/>
<ITEM VALUE="3" TITLE="test23"/>
<ITEM VALUE="4" TITLE="test24"/>
<ITEM VALUE="5" TITLE="test25"/>
<ITEM VALUE="6" TITLE="test26"/>
</ITEM>
<ITEM VALUE="3" TITLE="test28">
<ITEM VALUE="1" TITLE="test29"/>
<ITEM VALUE="2" TITLE="hasan"/>
</ITEM>
<ITEM VALUE="4" TITLE="test4"/>
<ITEM VALUE="5" TITLE="test5"/>
<ITEM VALUE="6" TITLE="test6"/>
<ITEM VALUE="7" TITLE="test7"/>
<ITEM VALUE="8" TITLE="test8"/>
<ITEM VALUE="9" TITLE="test9"/>
</MENU>
现在我希望能够像上面那样导入一个 xml 文件并填充表格 ITEMS
。我尝试同时使用 xmltable 和 xmltype 从 xml 中创建一个表,但问题是我无法使用此方法获取父/子层次结构。
select * from
xmltable('/menu//item'
passing xmltype(lower(xmldata))
columns
value varchar2(10) path '@value',
title varchar2(10) path '@title'
);
有什么办法可以让我找到哪个项目是哪个项目的子项?通过循环或游标或任何方式。时间消耗不是问题,因为这将是一项离线工作。此外,树变得很深,远远超过此处显示的 2 层。
谢谢!
最佳答案
此查询应该为您提供填充表格的起点。
select
rownum ID,
ELEMENT_NAME, PARENT_NAME, VALUE, PARENT_VALUE, TITLE, PARENT_TITLE, ELEMENT_LEVEL
from
xmltable('/menu//item'
passing xmltype(lower('<?xml version="1.0" ?>
<MENU ENCODE="0">
<ITEM VALUE="1" TITLE="test1">
<ITEM VALUE="1" TITLE="test10"/>
<ITEM VALUE="2" TITLE="test11"/>
<ITEM VALUE="3" TITLE="test12"/>
</ITEM>
<ITEM VALUE="2" TITLE="test2" >
<ITEM VALUE="1" TITLE="test21"/>
<ITEM VALUE="2" TITLE="test22"/>
</ITEM>
</MENU>'))
columns
--FULL_xml XMLType path './..',
element_name varchar2(4000) path 'local-name(.)',
parent_name varchar2(4000) path './../local-name(.)',
value varchar2(10) path '@value',
parent_value varchar2(10) path './../@value',
title varchar2(10) path '@title',
parent_title varchar2(10) path './../@title',
element_level number path 'count(ancestor::*)'
);
.
ID ELEMENT_NAME PARENT_NAME VALUE PARENT_VALUE TITLE PARENT_TITLE ELEMENT_LEVEL
---------- ------------ ----------- ---------- ------------ ---------- ------------ -------------
1 item menu 1 test1 1
2 item item 1 1 test10 test1 2
3 item item 2 1 test11 test1 2
4 item item 3 1 test12 test1 2
5 item menu 2 test2 1
6 item item 1 2 test21 test2 2
7 item item 2 2 test22 test2 2
如果必须添加父项的主键,则赋值,但这应该不是问题,因为我假设 VALUE 和 ELEMENT_LEVEL 是唯一的。
关于database - 将 xml 嵌套到表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415144/