【问题标题】:Oracle PL/SQL: get tag values while loopingOracle PL/SQL:在循环时获取标记值
【发布时间】:2013-01-14 11:39:28
【问题描述】:

我有一个包含以下类型内容的 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,每个值都应该放在相应的列中

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

【问题讨论】:

  • 有人请回答这个问题......我没有答案就死了

标签: plsql xml-parsing


【解决方案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
/

重新放荡:

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 或合并语句。

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 2012-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-27
    • 2012-04-28
    • 2016-08-03
    • 1970-01-01
    相关资源
    最近更新 更多