我有一个拥有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; /
答案 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