簡體   English   中英

oracle中的XML文件解析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM