将表的 Clob 字段转换为 xmltype 并拆分 xml 值以存储在表中的存储过程

问题描述

我有一个带有 Clob 字段的表

Create table xml_data
(id number,employee_data clob);

Employee_data table xml :
<employees>
<employee id=1>
<properties Name="firstname">Sherlock</properties>
<properties Name="lastname">Holmes</properties>
<properties Name="age">30</properties>
<properties Name="department" >investigation </properties>
</employee>

<employee id=2>
<properties Name="firstname">John</properties>
<properties Name="lastname">Watson</properties>
<properties Name="age">30</properties>
<properties Name="department">writing </properties>
</employee>
</employees>

Create table employees
(firstname varchar2(10),lastname varchar2(10),age number) ;

这是我的代码

declare 
v_xml xmltype;
begin 
select xmltype(x.employee_data) into v_xml from xml_data x where id=1;
insert into employees (firstname,lastname,age) 
select firstname,age from xmltable('/employees/employee[@id=1]')
       passing v_xml
       columns firstname varchar2(30) path '/properties[@firstname]',lastname varchar2(30) path '/properties[@lastname]',age number path '/properties[@age]');
end;
/

我排除以下输出

员工表:

名字 姓氏 年龄
夏洛克 福尔摩斯 30

但没有值被插入到员工表中。

任何人都可以提出一个更好的方法解决这个问题

解决方法

  • 您不需要 PL/SQL,只需一条 SQL 语句即可完成所有操作。
  • 您需要使用 path '/properties[@Name="firstname"]',因为您需要名为 Name 且值为 firstname 的属性,而不是搜索名为 firstname 的属性是否存在。

例如:

insert into employees (firstname,lastname,age)
select firstname,age
from   xml_data d
       CROSS JOIN xmltable(
         '/employees/employee[@id=1]'
         passing XMLTYPE(d.employee_data)
         columns
           firstname varchar2(30) path 'properties[@Name="firstname"]',lastname  varchar2(30) path 'properties[@Name="lastname"]',age       number       path 'properties[@Name="age"]'
       )
WHERE  d.id = 1;

此外,您的数据无效,因为您需要引用 XML 元素属性中的值(而不是使用更宽松的 HTML 语法),因此 <employee id=1> 应为 <employee id="1">。>

dbfiddle here