繁体   English   中英

尝试从 xmltype 中提取值但没有返回值

[英]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

db<>小提琴

如果您想要来自同一个 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM