如何从 Oracle 数据库中提取嵌套的 XMLType 数据?
How to extract nested XMLType Data from Oracle Database?
我有以下 xml 数据存储在数据库的 xmltype 列中。
<TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2009"/>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Not Found for given record id."/>
</TRNXS_DTL>
现在我尝试使用提取物查询数据库,如下所示:
SELECT SRC_DSC_TXT as "TXT",
TYPE_CODE as "Code",
PID as "Participant ID",
SYS_ID as "System",
CHANEL as "Channel",
to_char(crt_ts,'MM/DD/YYYY HH24:MI:SS') as "Timestamp (MST)",
extract(TRX_DATA, '/TRNXS_DTL/TRNX_ITEM/text()') as "DETAILS"
FROM PARTICIPANT_DATA,
WHERE SRC_VAL_TXT =TYPE_CD;
但是当我 运行 以上查询时,我在“详细信息”列下得到空值,有什么想法吗?
您 XML 中的标签没有任何文字。它具有三个属性:序列、名称和值。
所以,您的查询返回 NULL。
考虑以下示例。
create table myt(
type_code number,
trx_data xmltype
);
insert into myt values(101,
'<TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2009"/>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Not Found for given record id."/>
</TRNXS_DTL>'
);
insert into myt values(102,
'<TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2010">NNN</TRNX_ITEM>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Found for given record id.">OOO</TRNX_ITEM>
</TRNXS_DTL>'
);
SQL> select * from myt;
TYPE_CODE TRX_DATA
---------- -------------------------------------------------------------------------------------------------------------
101 <TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2009"/>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Not Found for given record id."/>
</TRNXS_DTL>
102 <TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2010">NNN</TRNX_ITEM>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Found for given record id.">OOO</TRNX_ITEM>
</TRNXS_DTL>
for type_code 102 有 NNN 和 OOO 作为文本。
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM/text()').getStringVal() as "DETAILS"
from myt;
TYPE_CODE DETAILS
---------- -------------
101
102 NNNOOO
你可以看到,它连接了两个标签的文本。
如果您想要属性值,可以使用 @
来指定属性。
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM/@value').getStringVal() as "DETAILS"
from myt;
TYPE_CODE DETAILS
---------- ------------------------------------------
101 2009Data Not Found for given record id.
102 2010Data Found for given record id.
同样,如您所见,文本是串联的。
如果你想让它们在单独的列中,你需要给出一个谓词来有条件地限制被选中的节点。
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="1"]/text()').getStringVal() as "DETAILS",
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="2"]/text()').getStringVal() as "DETAILS2"
from myt;
TYPE_CODE DETAILS DETAILS2
---------- ------------------------ --------------
101
102 NNN OOO
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="1"]/@value').getStringVal() as "DETAILS",
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="2"]/@value').getStringVal() as "DETAILS2"
from myt;
TYPE_CODE DETAILS DETAILS2
---------- ------------------------ ------------------------------------------
101 2009 Data Not Found for given record id.
102 2010 Data Found for given record id.
我有以下 xml 数据存储在数据库的 xmltype 列中。
<TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2009"/>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Not Found for given record id."/>
</TRNXS_DTL>
现在我尝试使用提取物查询数据库,如下所示:
SELECT SRC_DSC_TXT as "TXT",
TYPE_CODE as "Code",
PID as "Participant ID",
SYS_ID as "System",
CHANEL as "Channel",
to_char(crt_ts,'MM/DD/YYYY HH24:MI:SS') as "Timestamp (MST)",
extract(TRX_DATA, '/TRNXS_DTL/TRNX_ITEM/text()') as "DETAILS"
FROM PARTICIPANT_DATA,
WHERE SRC_VAL_TXT =TYPE_CD;
但是当我 运行 以上查询时,我在“详细信息”列下得到空值,有什么想法吗?
您 XML 中的标签没有任何文字。它具有三个属性:序列、名称和值。 所以,您的查询返回 NULL。
考虑以下示例。
create table myt(
type_code number,
trx_data xmltype
);
insert into myt values(101,
'<TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2009"/>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Not Found for given record id."/>
</TRNXS_DTL>'
);
insert into myt values(102,
'<TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2010">NNN</TRNX_ITEM>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Found for given record id.">OOO</TRNX_ITEM>
</TRNXS_DTL>'
);
SQL> select * from myt;
TYPE_CODE TRX_DATA
---------- -------------------------------------------------------------------------------------------------------------
101 <TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2009"/>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Not Found for given record id."/>
</TRNXS_DTL>
102 <TRNXS_DTL transactionSeq="1">
<TRNX_ITEM sequence="1" name="ERROR_CODE" value="2010">NNN</TRNX_ITEM>
<TRNX_ITEM sequence="2" name="ERROR_DESC" value="Data Found for given record id.">OOO</TRNX_ITEM>
</TRNXS_DTL>
for type_code 102 有 NNN 和 OOO 作为文本。
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM/text()').getStringVal() as "DETAILS"
from myt;
TYPE_CODE DETAILS
---------- -------------
101
102 NNNOOO
你可以看到,它连接了两个标签的文本。
如果您想要属性值,可以使用 @
来指定属性。
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM/@value').getStringVal() as "DETAILS"
from myt;
TYPE_CODE DETAILS
---------- ------------------------------------------
101 2009Data Not Found for given record id.
102 2010Data Found for given record id.
同样,如您所见,文本是串联的。
如果你想让它们在单独的列中,你需要给出一个谓词来有条件地限制被选中的节点。
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="1"]/text()').getStringVal() as "DETAILS",
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="2"]/text()').getStringVal() as "DETAILS2"
from myt;
TYPE_CODE DETAILS DETAILS2
---------- ------------------------ --------------
101
102 NNN OOO
SQL> select type_code,
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="1"]/@value').getStringVal() as "DETAILS",
extract(trx_data, '/TRNXS_DTL/TRNX_ITEM[@sequence="2"]/@value').getStringVal() as "DETAILS2"
from myt;
TYPE_CODE DETAILS DETAILS2
---------- ------------------------ ------------------------------------------
101 2009 Data Not Found for given record id.
102 2010 Data Found for given record id.