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

Stored procedure to Convert Clob field of table into xmltype and split xml values to store in the table

我有一个 table 带有 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,lastname,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;
/

我排除了以下输出:

员工table:

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

但没有将任何值插入到员工中 table。

任何人都可以建议一个更好的方法来解决这个问题

  • 您不需要 PL/SQL 并且可以在一个 SQL 语句中完成。
  • 您需要使用 path '/properties[@Name="firstname"]',因为您希望名为 Name 的属性的值为 firstname,而不是搜索名为 firstname 的属性是否存在。

例如:

insert into employees (firstname,lastname,age)
select firstname,
       lastname,
       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">.

db<>fiddle here