Oracle Extract返回null

时间:2017-03-13 17:02:04

标签: oracle plsql oracle11g

我对使用XML数据的Oracle EXTRACT有疑问。我有这个xml数据:

<MSH xmlns="http://tempuri.org/layout.xsd">
    <PK_REPMSH>1</PK_REPMSH>
    <TIPO_OPER>A</TIPO_OPER>
    <TIPO_CHAVE>CHAVE</TIPO_CHAVE>
    <DATA_INC>20140508175904</DATA_INC>
    <HORA_INC>17:59</HORA_INC>
    <EVN>
        <TIPO_CHAVE_EVENTO>A1</TIPO_CHAVE_EVENTO>
        <DATA_INC_EVENTO>20140508175904</DATA_INC_EVENTO>
        <HORA_INC_EVENTO>17:59</HORA_INC_EVENTO>
    </EVN>
    <PID>
        <COD_PACIENTE>000001533</COD_PACIENTE>
        <PRIMEIRO_NOME>VINICIOS<PRIMEIRO_NOME>
        <ULTIMO_NOME>RODRIGUES</ULTIMO_NOME>
        <DATA_NASCIMENTO>151561321</DATA_NASCIMENTO>
        <SEXO>M</SEXO>
        <ENDERECO_RES>RUA DE MENTIRA</ENDERECO_RES>
        <NU_ENDERECO_RES>10</NU_ENDERECO_RES>
        <PAIS>BRASIL</PAIS>
        <CIDADE>RECIFE</CIDADE>
        <CEP>515160561</CEP>
        <DS_BAIRRO_RES>MENTIRINHA</DS_BAIRRO_RES>
    </PID>
</MSH>

我创建此SQL以提取&#34; PRIMEIRO_NOME&#34;来自XML数据:

SELECT TRN_IN_ID, EXTRACT(xmlType(XML_BL_XML), '/MSH/PID/PRIMEIRO_NOME') AS XML_BL_XML FROM intp_lob_xml WHERE TRN_IN_ID = '1'

但是select的结果集是null XML_BL_XML。

TRN_IN_ID              XML_BL_XML                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
---------------------- ------------- 
1                      null    

OBS:XML_BL_XML是CLOB列。

如何解决这个问题?有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:2)

  

但select的结果集为null

这是因为在xml文档中指定了命名空间。

以下是使用extract()函数的示例。命名空间作为第三个参数传递给函数:

with t1(xmldoc) as(
  select xmltype(
  '<MSH xmlns="http://tempuri.org/layout.xsd">
    <PK_REPMSH>1</PK_REPMSH>
    <TIPO_OPER>A</TIPO_OPER>
    <TIPO_CHAVE>CHAVE</TIPO_CHAVE>
    <DATA_INC>20140508175904</DATA_INC>
    <HORA_INC>17:59</HORA_INC>
    <EVN>
        <TIPO_CHAVE_EVENTO>A1</TIPO_CHAVE_EVENTO>
        <DATA_INC_EVENTO>20140508175904</DATA_INC_EVENTO>
        <HORA_INC_EVENTO>17:59</HORA_INC_EVENTO>
    </EVN>
    <PID>
        <COD_PACIENTE>000001533</COD_PACIENTE>
        <PRIMEIRO_NOME>VINICIOS</PRIMEIRO_NOME>
        <ULTIMO_NOME>RODRIGUES</ULTIMO_NOME>
        <DATA_NASCIMENTO>151561321</DATA_NASCIMENTO>
        <SEXO>M</SEXO>
        <ENDERECO_RES>RUA DE MENTIRA</ENDERECO_RES>
        <NU_ENDERECO_RES>10</NU_ENDERECO_RES>
        <PAIS>BRASIL</PAIS>
        <CIDADE>RECIFE</CIDADE>
        <CEP>515160561</CEP>
        <DS_BAIRRO_RES>MENTIRINHA</DS_BAIRRO_RES>
    </PID>
</MSH>') 
  from dual
)
select extract(xmldoc, 
              '/MSH/PID/PRIMEIRO_NOME/text()', 
              'xmlns="http://tempuri.org/layout.xsd"').getStringVal() as res
  from t1

结果:

RES               
----------------
VINICIOS        

1 row selected.

如果可能存在多个PID并且您需要全部返回它们,则可以使用xmltable()函数。这里我们使用xmlnamespace子句来指定一组命名空间(xmltable()函数的第一个参数)。

   with t1(xmldoc) as(
      select xmltype(
      '<MSH xmlns="http://tempuri.org/layout.xsd">
        <PK_REPMSH>1</PK_REPMSH>
        <TIPO_OPER>A</TIPO_OPER>
        <TIPO_CHAVE>CHAVE</TIPO_CHAVE>
        <DATA_INC>20140508175904</DATA_INC>
        <HORA_INC>17:59</HORA_INC>
        <EVN>
            <TIPO_CHAVE_EVENTO>A1</TIPO_CHAVE_EVENTO>
            <DATA_INC_EVENTO>20140508175904</DATA_INC_EVENTO>
            <HORA_INC_EVENTO>17:59</HORA_INC_EVENTO>
        </EVN>
        <PID>
            <COD_PACIENTE>000001533</COD_PACIENTE>
            <PRIMEIRO_NOME>VINICIOS</PRIMEIRO_NOME>
            <ULTIMO_NOME>RODRIGUES</ULTIMO_NOME>
            <DATA_NASCIMENTO>151561321</DATA_NASCIMENTO>
            <SEXO>M</SEXO>
            <ENDERECO_RES>RUA DE MENTIRA</ENDERECO_RES>
            <NU_ENDERECO_RES>10</NU_ENDERECO_RES>
            <PAIS>BRASIL</PAIS>
            <CIDADE>RECIFE</CIDADE>
            <CEP>515160561</CEP>
            <DS_BAIRRO_RES>MENTIRINHA</DS_BAIRRO_RES>
        </PID>
        <PID> <PRIMEIRO_NOME>VINICIOS 2</PRIMEIRO_NOME> </PID>
    </MSH>') 
      from dual
    )
 select prim
  from t1
  cross join xmltable(xmlnamespaces(default 'http://tempuri.org/layout.xsd'),
                      '/MSH/PID' passing t1.xmldoc
                      columns prim varchar2(255) path 'PRIMEIRO_NOME')

结果:

PRIM                  
-----------------
VINICIOS                     
VINICIOS 2                   

2 rows selected.