[英]Trying to extract a value from an xmltype but no value returned
这是我的 Oracle SQL:
WITH q1(Tdata,paymentinterchangekey) AS
(
SELECT XMLtype(transportdata, 1), paymentinterchangekey
FROM bph_owner.paymentinterchange
WHERE paymentinterchangekey = '137630105'
)
SELECT EXTRACT(q1.Tdata, '/Document/CstmrCdtTrfInitn/GrpHdr/MsgId'),
q1.Tdata,
q1.paymentinterchangekey "EE",
q1.paymentinterchangekey "EE"
FROM q1;
和数据是:
<?xml version="1.0" encoding="ISO-8859-1"?>
<Document xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03 pain.001.001.03.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" >
<CstmrCdtTrfInitn>
<GrpHdr>
<MsgId>SEPA21012022</MsgId>
<CreDtTm>2022-01-20T11:45:59.177</CreDtTm>
<NbOfTxs>12</NbOfTxs>
<CtrlSum>22277.57</CtrlSum>
<InitgPty>
<Nm>
知道为什么 EXTRACT 值为空吗?
EXTRACT
已弃用。 使用XMLQUERY
并声明命名空间:
with q1 ( Tdata, paymentinterchangekey) AS (
SELECT XMLtype(transportdata),
paymentinterchangekey
from bph_owner.paymentinterchange
where paymentinterchangekey = '137630105'
)
select XMLQUERY(
'declare default element namespace "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03";
/Document/CstmrCdtTrfInitn/GrpHdr/MsgId/text()'
PASSING q1.Tdata
RETURNING CONTENT
) AS msgid,
q1.Tdata,
q1.paymentinterchangekey "EE"
from q1;
db<> 在这里摆弄
忽略格式错误的 XML,问题在于您的Document
节点声明了一个名称空间,而您不包括该名称空间; 所以你需要做:
EXTRACT(q1.Tdata, '/Document/CstmrCdtTrfInitn/GrpHdr/MsgId',
'xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"')
这会给你
<MsgId xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03">SEPA21012022</MsgId>
大概你只想要实际值,而不是整个节点,所以你可以这样做:
EXTRACT(q1.Tdata, '/Document/CstmrCdtTrfInitn/GrpHdr/MsgId/text()',
'xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"')
要得到
SEPA21012022
但是, EXTRACT()
函数已被弃用,并且已经存在很长时间了,因此您应该改用 XMLQuery:
with q1 (Tdata) as (
SELECT XMLtype(transportdata,1) from paymentinterchange
)
select XMLQuery('
declare default element namespace "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03";
/Document/CstmrCdtTrfInitn/GrpHdr/MsgId/text()'
passing Tdata
returning content).getstringval()
from q1
如果您想要来自同一个 XML 的多个值,请查看 XMLTable。
因此,我现在将其作为通用 SQL 运行,但出现以下错误: ORA-31011:XML 解析失败 ORA-19202:XML 处理 LPX-00216 中发生错误:无效字符 195 (0xC3) 第 150 行出现错误 ORA-06512:在“SYS.XMLTYPE”,第 283 行 ORA-06512:在第 1 行有没有办法“跳过”格式错误的行?
这些行没有格式错误。 XML 声明说编码是 ISO-8859-1,它允许任何 'Latin-1 (Western)' 字符,例如Ã
- 编码为0xC3
。 您的 XML 存储为 BLOB,您将其转换为 XMLType。 但作为该转换的一部分,您将1
作为csid
值传递。 这代表 ASCII(或 Oracle 中的US7ASCII
)。 所以转换只需要 ASCII 字符,并且抱怨其他任何东西。
对应于 ISO-8859-1 的 Oracle 字符集名称是WE8ISO8859P1
,因此您需要为其提供字符集 ID:
with q1 (Tdata) as (
SELECT XMLtype(transportdata, nls_charset_id('WE8ISO8859P1')) from paymentinterchange
)
...
db<>fiddle显示您遇到的相同错误以及使用正确字符集的成功查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.