将 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
我有一个 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