【问题标题】:how to check CLOB is having prolog or not如何检查 CLOB 是否有序言
【发布时间】:2014-05-28 21:01:34
【问题描述】:

我有一个包含 xml 数据的 clob 列。在这里,我编写了一个验证数据是否为 ​​xml 的函数。我使用了“xmldata := XMLTYPE(xml);”。它工作正常。

我尝试了几个输入,例如

SELECT isXML('<testfdjkasksdf</test>') FROM DUAL; O
SELECT isXML('<test>fdjkasksdf</test>') FROM DUAL; 1

在我们报告未检查 prolog 的问题之前,一切对我来说都很好。用户希望在 XML 数据之前查看序言。如果输入 xml 没有序言,我如何抛出错误或消息。

我的功能是

CREATE OR REPLACE FUNCTION isXML(xml CLOB)
RETURN NUMBER
AS
xmldata XMLTYPE;
BEGIN
xmldata := XMLTYPE(xml);
return 1;
EXCEPTION
when others then
return 0;

结束; /

【问题讨论】:

    标签: oracle oracle11g oracle10g


    【解决方案1】:

    这有点小技巧,但你可以这样做:

    CREATE OR REPLACE FUNCTION isXML(xml CLOB)
    RETURN NUMBER
    AS
      xmldata XMLTYPE;
      xml_parse_error EXCEPTION;
      PRAGMA EXCEPTION_INIT(xml_parse_error, -31011);
    BEGIN
      BEGIN
        xmldata := XMLTYPE(xml);
      EXCEPTION
        WHEN xml_parse_error THEN
          return 0;
      END;
    
      BEGIN
        xmldata := xmltype('<?xml version="1.0"?>' || xml);
      EXCEPTION
        WHEN xml_parse_error THEN
          -- xml already had prolog
          xmldata := null;
      END;
    
      IF xmldata is not null then
        -- xml did not already have prolog
        return 0;
      END IF;
    
      return 1;
    END;
    /
    

    第一个XMLTYPE(xml)是你现在拥有的;如果出现 XML 解析错误 (ORA-31011),则会立即被拒绝。

    第二个前置一个虚拟序言。如果xml 已经有一个序言,那么这将失败;如果没有发现错误,您会看到:

    ORA-31011: XML parsing failed
    ORA-19202: Error occurred in XML processing
    LPX-00209: PI names starting with XML are reserved
    

    如果生成了该错误,则 xml 确实有一个序言并且 xmldata 设置为 null。如果 not 生成了该错误,则 xml 没有 not 有序言,xmldata 将包含 XML 文档。

    然后我检查xmldata 是否为空。如果是,那么它出错并且有一个序言,所以没关系。如果它不为 null,则最初没有 prolog,我们希望将其视为错误。

    SELECT isXML('<testfdjkasksdf</test>') FROM DUAL;
    
    ISXML('<TESTFDJKASKSDF</TEST>')
    -------------------------------
                                  0 
    
    SELECT isXML('<test>fdjkasksdf</test>') FROM DUAL;
    
    ISXML('<TEST>FDJKASKSDF</TEST>')
    --------------------------------
                                   0 
    
    SELECT isXML('<?xml version="1.0" standalone="yes"?><test>fdjkasksdf</test>')
    FROM DUAL;
    
    ISXML('<?XMLVERSION="1.0"STANDALONE="YES"?><TEST>FDJKASKSDF</TEST>')
    --------------------------------------------------------------------
                                                                       1 
    

    【讨论】:

    • 感谢回复。我已经更新了你的函数,然后尝试了 SELECT isXML('fdjkasksdf') FROM DUAL;它给了我 1 但我希望它为 0。因为它没有 prolog 。是这样的吗?
    • @user1268890 - 当我使用该功能代码运行SELECT isXML('&lt;test&gt;fdjkasksdf&lt;/test&gt;') FROM DUAL; 时,我得到0。你用 10g 和 11g 标记了这个问题;您使用的是哪个确切版本?我在 11.2.0.3 上测试过,it works as expected on SQL Fiddle 是 11.2.0.2。
    • 非常感谢它正在工作。我用的是11g express版。
    猜你喜欢
    • 2018-12-25
    • 1970-01-01
    • 2017-10-16
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    相关资源
    最近更新 更多