[英]XML file parsing in oracle
我做了下面的步驟
CREATE directory XMLDIR AS 'C:\err_log';
SELECT * FROM example2;
INSERT INTO example2
VALUES
(
xmltype
(
BFILENAME('XMLDIR', 'abc.xml'),
NLS_CHARSET_ID('AL32UTF8')
)
);
這個查詢
SELECT extract(OBJECT_VALUE, '/users/*/UserName/text()') FROM example2;
給我結果一排
SureshDasariMaheshDasariMadhavYemineni
應該像
SureshDasari MaheshDasari MadhavYemineni
XML文件內容
`<users>
<user>
<FirstName>Suresh</FirstName>
<LastName>Dasari</LastName>
<UserName>SureshDasari</UserName>
<Job>Team Leader</Job>
</user>
<user>
<FirstName>Mahesh</FirstName>
<LastName>Dasari</LastName>
<UserName>MaheshDasari</UserName>
<Job>Software Developer</Job>
</user>
<user>
<FirstName>Madhav</FirstName>
<LastName>Yemineni</LastName>
<UserName>MadhavYemineni</UserName>
<Job>Business Analyst</Job>
</user>
</users>
您可以嘗試以下
DECLARE
temp_field varchar2(4000);
x XMLType := XMLType(
'<?xml version="1.0" ?>
<users>
<user>
<FirstName>Suresh</FirstName>
<LastName>Dasari</LastName>
<UserName>SureshDasari</UserName>
<Job>Team Leader</Job>
</user>
<user>
<FirstName>Mahesh</FirstName>
<LastName>Dasari</LastName>
<UserName>MaheshDasari</UserName>
<Job>Software Developer</Job>
</user>
<user>
<FirstName>Madhav</FirstName>
<LastName>Yemineni</LastName>
<UserName>MadhavYemineni</UserName>
<Job>Business Analyst</Job>
</user>
</users>');
BEGIN
FOR VAL_IN_XML IN (
SELECT ExtractValue(Value(p),'/user/UserName/text()') as name
FROM TABLE(XMLSequence(Extract(x,'/users/user'))) p
)
Loop
begin
temp_field:=temp_field||' '||VAL_IN_XML.name;
end;
end loop;
----Do ur requirement here
insert into temp_table values(temp_field);--i'm just inserting in temp_table
Execute immediate 'commit';
END;
我得到的輸出
SureshDasari MaheshDasari MadhavYemineni
也許可以做得更簡單-
with t as
(select
'<users>
<user>
<FirstName>Suresh</FirstName>
<LastName>Dasari</LastName>
<UserName>SureshDasari</UserName>
<Job>Team Leader</Job>
</user>
<user>
<FirstName>Mahesh</FirstName>
<LastName>Dasari</LastName>
<UserName>MaheshDasari</UserName>
<Job>Software Developer</Job>
</user>
<user>
<FirstName>Madhav</FirstName>
<LastName>Yemineni</LastName>
<UserName>MadhavYemineni</UserName>
<Job>Business Analyst</Job>
</user>
</users>' as xml_
from dual)
select rtrim(xmlagg(xmlelement ("UserName", extractvalue(column_value,'/UserName') || ' ')).extract ('//text()'), ' ') as UserNames
from t, table(xmlsequence(extract(XMLTYPE(t.xml_), '/users/*/UserName')))
就您而言,它看起來像這樣-
select rtrim(xmlagg(xmlelement ("UserName", extractvalue(column_value,'/UserName') || ' ')).extract ('//text()'), ' ') as UserNames
from example2, table(xmlsequence(extract(OBJECT_VALUE, '/users/*/UserName')))
更新:如果要在過程中使用xml數據作為參數,則可以這樣操作-
procedure parse(xml_data_ in clob) is
declare
UserNames_ varchar2(4000);
begin
select rtrim(xmlagg(xmlelement ("UserName", extractvalue(column_value,'/UserName') || ' ')).extract ('//text()'), ' ') as UserNames
into UserNames_
from table(xmlsequence(extract(XMLTYPE(xml_data_), '/users/*/UserName')));
end;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.