簡體   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