我对使用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列。
如何解决这个问题?有人可以帮帮我吗?
答案 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.