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

时间:2018-02-28 11:03:45

标签: xml oracle xml-parsing

我有一个查询导致我出现以下错误: 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中。 e.g:

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

但我的约束是处理包含&#34;]]&gt;&#34;的数据。同样。

1 个答案:

答案 0 :(得分: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

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

The documentation说:

  

以下条件适用于XMLCData:

     
      
  • value_expr 不能包含子字符串]]&gt;。
  •   

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

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

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