如何检查CLOB是否有序言

时间:2014-05-28 10:42:10

标签: oracle oracle11g oracle10g

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

我尝试了几个输入,比如

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

在我们遇到一个问题报告它没有检查prolog之前,一切看起来都不错。用户希望在XML数据之前看到prolog。如果输入xml没有prolog,我怎么能抛出错误或消息。

我的功能是

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

END;    /

1 个答案:

答案 0 :(得分: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。如果该错误生成,那么xml 有序言,xmldata将包含XML文档。

然后我检查xmldata是否为空。如果它是错误的并且有一个prolog所以它没关系。如果它不是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