Oracle PL / SQL:在循环时获取标记值

时间:2013-01-14 11:39:28

标签: plsql xml-parsing

我有一个包含以下内容类型的xml

<DATA>
  <CUSTOMER>
    <BASIC_INFO>
         <F_NAME>TOM<F_NAME>
         <M_NAME>AND<M_NAME>
         <L_NAME>HANKS<L_NAME>
    </BASIC_INFO>
    <ADDITIONAL_INFO>
         <EMAIL>TOM.HANKS@GMAIL.COM</EMAIL>
         <PHONE_NO>22211132</PHONE_NO>
    </ADDITIONAL_INFO>
  </CUSTOMER>

  <CUSTOMER>
    <BASIC_INFO>
         <F_NAME>TOM<F_NAME>
         <L_NAME>HANKS<L_NAME>
    </BASIC_INFO>
    <ADDITIONAL_INFO>
         <EMAIL>TOM.HANKS@GMAIL.COM</EMAIL>
    </ADDITIONAL_INFO>
  </CUSTOMER>

  <CUSTOMER>
    <BASIC_INFO>
         <F_NAME>TOM<F_NAME>
    </BASIC_INFO>
    <ADDITIONAL_INFO>
        <PHONE_NO>22211132</PHONE_NO>
    </ADDITIONAL_INFO>
  </CUSTOMER>

我想在表格中存储客户信息,其中的列为F_NAME,M_NAME,L_NAME,PHONE_NO,EMAIL,每个值都应列在相应的列中

现在需要注意的是,对于那些不存在某些信息的客户,不应插入表格中的值。

1 个答案:

答案 0 :(得分:1)

您可以分两步完成。

首先创建数据的关系表示:

来自sql-plsql-de.blogspot.co.at的示例:

create table xmltest (
  dokument xmltype
)
/

insert into xmltest values (xmltype(
'<blog>
  <name>SQL und PL/SQL</name>
  <autor>Carsten Czarski</autor>
  <themen>
    <thema>XML</thema>
    <thema>PL/SQL</thema>
  </themen>
</blog>'
))
/

本声明:

select
  extractvalue(dokument, '/blog/name') as blog_name,
  extractvalue(dokument, '/blog/autor') as blog_autor,
  extractvalue(value(thema), '/thema/text()') as thema
from xmltest,
  table(xmlsequence(extract(dokument, '/blog/themen/thema'))) thema
/

Re sluts in:

BLOG_NAME            BLOG_AUTOR      THEMA
-------------------- --------------- --------------------
SQL und PL/SQL       Carsten Czarski XML
SQL und PL/SQL       Carsten Czarski PL/SQL

现在你以关系的方式拥有它,你可以循环它:

for cur in (select * from ...) 
loop
  if cur.column_a is not null then
    --insert
  end if;
end loop;

这很慢但即使你有复杂的规则也能保持可读性。 或者,您可以使用“普通”SQL或合并语句。