ORA-19041:评论数据不能包含两个'连续'

问题描述 投票:0回答:1

我有一个查询,导致我出现以下错误:ORA-19041:评论数据不能包含两个'连续'

SQL查询:

SELECT XMLElement("errorlist", fXML.cdata('ORA31011: XML parsing failed 
ORA19213: error occurred in XML processing at lines 1 
LPX00214: CDATA section did not end in "]]>"')) FROM dual;

在这段代码中,fXML.cdata是一个函数:

  FUNCTION CData(ValueExpr VARCHAR2) RETURN XMLTYPE
  IS BEGIN RETURN obj.fxml.CData(ValueExpr); END;

和obj.fxml.CData是一个TYPE:

FINAL STATIC FUNCTION CData(ValueExpr VARCHAR2) RETURN XMLTYPE,

即使我从传递的字符串中删除了“ - ”,它也给了我同样的错误。

但是当我删除“]]>”时,它会正常处理。由于获取的数据存储在cdata中。例如。:

<errorlist><![CDATA[ORA-31011: XML parsing failed
ORA-19213: error occurred in XML processing at lines 1
LPX-00214: CDATA section did not end in ]]></errorlist>

但我的约束是处理包含“]]>”的数据。

xml oracle xml-parsing
1个回答
2
投票

没有看到你的类型函数正在做,这似乎归结为:

select XMLCData('ORA-31011: XML parsing failed 
ORA19213: error occurred in XML processing at lines 1 
LPX00214: CDATA section did not end in "]]>"')
from dual;

ORA-19041: Comment data cannot contain two consecutive '-'s

该错误有点令人困惑,但鉴于您没有连续的破折号并删除]]>部分解决了错误,似乎错误代码只是在不更改消息文本的情况下被重用。

The documentation说:

以下条件适用于XMLCData:

  • value_expr不能包含子串]]>。

似乎没有办法逃避这一点;它是the specification的一部分。您必须修改传入的字符串,以便它不包含该字符序列 - 但您必须决定用什么来替换它们(如果有的话),并且消耗生成的XML / CData需要的任何东西要注意它,或者不在乎。

如果一个人最终会阅读它,那么用'期望值'替换它可能就足够了;或者你可以删除>;或编码它,例如通过将其更改为&gt;(听起来像是太多的黑客攻击);或添加空格以打破字符序列(这可能会令人困惑);或者对你的情况有意义的事情。

您也可以将它分成两个CDATA部分,as suggested here;但这可能是你在你的类型函数中做的事情,而不是调用者必须知道的事情。但它又取决于它将如何被消耗,以及是否将理解生成的XML。

© www.soinside.com 2019 - 2024. All rights reserved.