database - 将 xml 嵌套到表中

标签 database oracle oracle11g

我有一个定义如下的表

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/

相关文章:

mysql - 我应该如何优化我的 MySQL 查询或表?

java - 使用数据库池时出现太多连接错误

sql-server - 将 OPENQUERY 与 Oracle 数据库结合使用来查询日期范围

oracle - 编译无效的 oracle 程序

database - ORA-28113 : policy predicate has error

mysql - 列数变化时的数据库选择

mysql - 为 SELECT 查询合并 2 个表?

sql - 为每条记录分配随机值,而不仅仅是整个查询

java - 在 sql Developer (oracle 11g) 中组织查询结果

sql - PLSQL生成随机整数