如何在pl-sql中解析xml?

Posted

技术标签:

【中文标题】如何在pl-sql中解析xml?【英文标题】:How to parse xml in pl-sql? 【发布时间】:2015-09-03 11:33:01 【问题描述】:

我有一个包含 xml 和虚拟文本的字符串,如下所示。

我需要读取值 Hello world999

你能帮忙吗?

[GCM] Dummy text1
[GCM] Dummy text2

<PARAMETER_LIST>
  <PARAMETER>
    <NAME>SMS</NAME> 
    <VALUE>Hello world</VALUE>
  </PARAMETER>
  <PARAMETER>
    <NAME>ERROR_CODE</NAME>
    <VALUE>999</VALUE>
  </PARAMETER> 
</PARAMETER_LIST> 

【问题讨论】:

【参考方案1】:

另外,您可能想使用 XMLTABLE:

SELECT
  px.*
FROM
  XMLTABLE(
    '/PARAMETER_LIST/PARAMETER' PASSING 
      XMLTYPE(
        REGEXP_REPLACE('
              [GCM] Dummy text1
              [GCM] Dummy text2
              <PARAMETER_LIST>
                <PARAMETER>
                  <NAME>SMS</NAME> 
                  <VALUE>Hello world</VALUE>
                </PARAMETER>
                <PARAMETER>
                  <NAME>ERROR_CODE</NAME>
                  <VALUE>999</VALUE>
                </PARAMETER> 
              </PARAMETER_LIST>'
              ,'^[^<]+'
              ,''
              )
        )
    COLUMNS param_id FOR ORDINALITY
    ,name VARCHAR2(40) PATH 'NAME'
    ,value VARCHAR2(400) PATH 'VALUE'
  ) px;

这会给你结果:

  PARAM_ID  |    NAME      |    VALUE
------------------------------------------
   1        |    SMS       |  Hello world
   2        |  ERROR_CODE  |   999

此外,Shaun Peterson 的解决方案稍作调整(无需切换 PLSQL - SQL 上下文):

declare

MY_STRING VARCHAR2(4000) := '[GCM] DUMMY TEXT1 [GCM] DUMMY TEXT2 <PARAMETER_LIST><PARAMETER><NAME>SMS</NAME><VALUE>Hellow world</VALUE></PARAMETER><PARAMETER><NAME>ERROR_CODE</NAME><VALUE>999</VALUE></PARAMETER></PARAMETER_LIST>';
MY_XML XMLTYPE;

MY_SMS VARCHAR2(100);
MY_ERROR_CODE VARCHAR2(100); 

begin

MY_XML := XMLTYPE(SUBSTR(MY_STRING, INSTR(MY_STRING, '<'))) ;
MY_SMS := MY_XML.EXTRACT('/PARAMETER_LIST/PARAMETER[NAME="SMS"]/VALUE/text()').getstringval;
MY_ERROR_CODE := MY_XML.EXTRACT('/PARAMETER_LIST/PARAMETER[NAME="ERROR_CODE"]/VALUE/text()').getstringval;

DBMS_OUTPUT.PUT_LINE('MY_SMS = ' || MY_SMS);
DBMS_OUTPUT.PUT_LINE('MY_ERROR_CODE = ' || MY_ERROR_CODE);

end;

【讨论】:

【参考方案2】:

您好,我将从该字符串中提取 xml,将其放入 xml 类型中,然后从那里进行处理。请参阅下面的示例。

declare

MY_STRING VARCHAR2(4000) := '[GCM] DUMMY TEXT1 [GCM] DUMMY TEXT2 <PARAMETER_LIST><PARAMETER><NAME>SMS</NAME><VALUE>Hellow world</VALUE></PARAMETER><PARAMETER><NAME>ERROR_CODE</NAME><VALUE>999</VALUE></PARAMETER></PARAMETER_LIST>';
MY_XML XMLTYPE;

MY_SMS VARCHAR2(100);
MY_ERROR_CODE VARCHAR2(100); 

begin

SELECT XMLTYPE(SUBSTR(MY_STRING, INSTR(MY_STRING, '<'))) 
INTO MY_XML
FROM DUAL;

SELECT EXTRACTVALUE(MY_XML, '/PARAMETER_LIST/PARAMETER[NAME="SMS"]/VALUE'),
       EXTRACTVALUE(MY_XML, '/PARAMETER_LIST/PARAMETER[NAME="ERROR_CODE"]/VALUE')
INTO MY_SMS, MY_ERROR_CODE
FROM DUAL;

DBMS_OUTPUT.PUT_LINE('MY_SMS = ' || MY_SMS);
DBMS_OUTPUT.PUT_LINE('MY_ERROR_CODE = ' || MY_ERROR_CODE);

end;

这会给你输出

MY_SMS = Hellow World

MY_ERROR_CODE = 999

【讨论】:

以上是关于如何在pl-sql中解析xml?的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程中使用游标?

如何在pl-sql中修复此功能

在 PL-SQL 存储过程中为 XML 中的每个段生成唯一 ID

如何在 PL-SQL 中舍入数字?

如何使用 PL-SQL 在 Oracle 中获取列数据类型

如何在 PL-SQL 上更改之前获取视图/触发器?