在Oracle PL / SQL中使用XML Schema验证XML文档?

时间:2017-07-13 10:03:19

标签: xml oracle plsql schema

我正在编写一个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'不是程序或未定义

非常感谢任何解决此问题的帮助。

1 个答案:

答案 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)。