【问题标题】:Oracle Extract returns nullOracle 提取返回 null
【发布时间】:2017-03-14 04:28:57
【问题描述】:

我有一个关于带有 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 以从 XML 数据中提取“PRIMEIRO_NOME”:

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 列。

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

【问题讨论】:

  • 尝试检查来自xmltype转换函数的结果。您可能需要在函数中添加第二个参数来设置字符集 ID。
  • Oi @RenatoAfonso ,一个函数 xmlType retorna o xml 正常。 A parte de adicionar um segundo parâmetro eu não entendi muito bem, teria como mostrar um exemplo?

标签: oracle plsql oracle11g


【解决方案1】:

但是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.

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 2018-10-10
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 2019-12-26
    相关资源
    最近更新 更多