I did below step
CREATE directory XMLDIR AS 'C:\err_log';
SELECT * FROM example2;
INSERT INTO example2
VALUES
(
xmltype
(
BFILENAME('XMLDIR', 'abc.xml'),
NLS_CHARSET_ID('AL32UTF8')
)
);
This query
SELECT extract(OBJECT_VALUE, '/users/*/UserName/text()') FROM example2;
giving me result in one row
SureshDasariMaheshDasariMadhavYemineni
It should be like
SureshDasari MaheshDasari MadhavYemineni
XML file content
`<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>
You can try the following
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;
Output i'm getting
SureshDasari MaheshDasari MadhavYemineni
Maybe it can be done simpler -
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')))
In your case, it will look like this -
select rtrim(xmlagg(xmlelement ("UserName", extractvalue(column_value,'/UserName') || ' ')).extract ('//text()'), ' ') as UserNames
from example2, table(xmlsequence(extract(OBJECT_VALUE, '/users/*/UserName')))
Update: If you want use xml data as parameter in procedure, you can do it like this -
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;
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.