2017-03-13 59 views
1

我對Oracle EXTRACT和XML數據有疑問。我有這樣的XML數據:Oracle提取返回null

<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' 

但選擇的結果集爲空XML_BL_XML。

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

OBS:XML_BL_XML是一個CLOB列。

如何解決這個問題?任何人都可以幫助我?

+0

嘗試檢查結果來形式的XMLType轉換功能。您可能需要添加第二個參數來設置字符集ID。 –

+0

Oi @RenatoAfonso,一個函數xmlType返回xml正常。這是一個單獨的廣告嗎? –

回答

2

但選擇的結果集爲空

這是因爲你的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. 
+0

坦克男人!是工作!你拯救了我的生命。 –