在Oracle PL/SQL中针对模式验证XML文件

ste*_*evc 6 xml oracle ora-06512

我需要根据XSD验证传入的文件.两者都将在服务器文件系统上.

我看过了dbms_xmlschema,但是有问题让它发挥作用.

使用Java可以更容易吗?
我可以在数据库中放入的最简单的类是什么?

这是一个简单的例子:

DECLARE
  v_schema_url       VARCHAR2(200) := 'http://www.example.com/schema.xsd';
  v_blob             bLOB;
  v_clob             CLOB;
  v_xml XMLTYPE;
BEGIN
  begin
    dbms_xmlschema.deleteschema(v_schema_url);
  exception
    when others then
     null;
  end;

  dbms_xmlschema.registerSchema(schemaURL => v_schema_url,
                                schemaDoc => '
<xs:schema targetNamespace="http://www.example.com" 
xmlns:ns="http://www.example.com" 
xmlns:xs="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" attributeFormDefault="unqualified" version="3.0">
<xs:element name="something"  type="xs:string"/>
</xs:schema>',
                                local => TRUE);

  v_xml := XMLTYPE.createxml('<something xmlns="http://www.xx.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://www.example.com/schema.xsd">
data
</something>');

  IF v_xml.isschemavalid(v_schema_url) = 1 THEN
    dbms_output.put_line('valid');
  ELSE
    dbms_output.put_line('not valid');
  END IF;
END;
Run Code Online (Sandbox Code Playgroud)

这会生成以下错误:

ORA-01031: insufficient privileges
ORA-06512: at "XDB.DBMS_XDBZ0", line 275
ORA-06512: at "XDB.DBMS_XDBZ", line 7
ORA-06512: at line 1
ORA-06512: at "XDB.DBMS_XMLSCHEMA_INT", line 3
ORA-06512: at "XDB.DBMS_XMLSCHEMA", line 14
ORA-06512: at line 12
Run Code Online (Sandbox Code Playgroud)

use*_*735 5

更新

XML Schema注册需要以下权限:

grant alter session to <USER>;
grant create type to <USER>; /* required when gentypes => true */
grant create table to <USER>; /* required when gentables => true */
Run Code Online (Sandbox Code Playgroud)

由于某些原因,如果通过角色间接授予这些权限是不够的,但需要直接向模式/用户授予权限.

原始答案

我也注意到参数的默认值gentablesgentypes引发insufficient privileges异常.可能我只是缺乏使用这些功能的一些特权,但目前我还没有很好地理解他们做了什么.我很高兴禁用它们,验证似乎工作正常.

我正在使用Oracle Database 11g第11.2.0.1.0版

gentypes => true,gentables => true

dbms_xmlschema.registerschema(schemaurl => name,
                              schemadoc => xmltype(schema),
                              local => true
                              --gentypes => false,
                              --gentables => false
                              );

ORA-01031: insufficient privileges
ORA-06512: at "XDB.DBMS_XMLSCHEMA_INT", line 55
ORA-06512: at "XDB.DBMS_XMLSCHEMA", line 159
ORA-06512: at "JANI.XML_VALIDATOR", line 38
ORA-06512: at line 7
Run Code Online (Sandbox Code Playgroud)

gentypes => false,gentables => true

dbms_xmlschema.registerschema(schemaurl => name,
                              schemadoc => xmltype(schema),
                              local => true,
                              gentypes => false
                              --gentables => false
                              );

ORA-31084: error while creating table "JANI"."example873_TAB" for element "example"
ORA-01031: insufficient privileges
ORA-06512: at "XDB.DBMS_XMLSCHEMA_INT", line 55
ORA-06512: at "XDB.DBMS_XMLSCHEMA", line 159
ORA-06512: at "JANI.XML_VALIDATOR", line 38
ORA-06512: at line 7
Run Code Online (Sandbox Code Playgroud)

gentypes => true,gentables => false

dbms_xmlschema.registerschema(schemaurl => name,
                              schemadoc => xmltype(schema),
                              local => true,
                              --gentypes => false
                              gentables => false
                              );

ORA-01031: insufficient privileges
ORA-06512: at "XDB.DBMS_XMLSCHEMA_INT", line 55
ORA-06512: at "XDB.DBMS_XMLSCHEMA", line 159
ORA-06512: at "JANI.XML_VALIDATOR", line 38
ORA-06512: at line 7
Run Code Online (Sandbox Code Playgroud)

gentypes => false,gentables => false

dbms_xmlschema.registerschema(schemaurl => name,
                              schemadoc => xmltype(schema),
                              local => true,
                              gentypes => false,
                              gentables => false
                              );

PL/SQL procedure successfully completed.
Run Code Online (Sandbox Code Playgroud)


Ada*_*kes -2

如果我没记错的话,当 XDB(Oracle 的 XML 数据库包)未正确安装时,会出现该错误消息。让 DBA 检查一下。