我正在编写一个PL / SQL过程,它将根据模式验证XML类型文件。 XML文档存储在Oracle数据库中的XMLType表XML_TABLE
中,其中包含一列SYS_NC_ROWINFO$
。我希望使用的Schema也包含在同一Oracle数据库中,如XML Schema(CLOB),其URL为StructuredProductsXMLSchema0v0.1.49.xsd
。
目前,我只是尝试使用最简单的方法验证一个XML文档(因此在下面的代码中rownum = 1
)。以下是我创建的程序:
create or replace procedure XML_FILE_VALIDATOR is
XDATA XMLType;
begin
select SYS_NC_ROWINFO$ into XDATA
from XML_TABLE
where rownum = 1;
XDATA.isSchemaValid('StructuredProductsXMLSchema0v0.1.49.xsd');
if XDATA.isSchemaValid = 1 then
dbms_output.put_line ('XML document is VALID');
else
dbms_output.put_line ('XML document is INVALID => '||sqlerrm);
end if;
end;
不幸的是,我收到一条错误消息:
PLS-00221:'ISSCHEMAVALID'不是程序或未定义
非常感谢任何解决此问题的帮助。
答案 0 :(得分:1)
首先是link to the docs。我不知道你的版本,但它不应该那么重要。
PL / SQL函数
isSchemaValid
检查输入实例是否符合指定的XML模式。
所以这是一个成员函数,而不是一个过程。这就是您的代码在第XDATA.isSchemaValid('StructuredProductsXMLSchema0v0.1.49.xsd');
行失败的原因。
你不需要它。
然后你有一个if语句,你试图将它用作函数(正确)但不传递参数(这不会起作用)。
如果未指定XML架构URL且XML文档是基于架构的,则会根据XMLType实例的自身架构检查一致性。
这不是您的情况,因为您的XML文档不是基于模式的。
if XDATA.isSchemaValid('StructuredProductsXMLSchema0v0.1.49.xsd') then
....
end if
那可能会奏效。作为旁注,我不确定网址是否正确(它们通常看起来有点不同,但你可以弄清楚,只需登记ALL_XML_SCHEMAS
)。