6

着信ファイルを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;

これにより、次のエラーが生成されます。

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
4

6 に答える 6

5

アップデート

XML スキーマの登録には、次の権限が必要です。

grant alter session to <USER>;
grant create type to <USER>; /* required when gentypes => true */
grant create table to <USER>; /* required when gentables => true */

何らかの理由で、これらの権限がロールを介して間接的に付与されるだけでは十分ではありませんが、権限はschema/user に直接付与される必要があります。

元の回答

gentablesパラメータのデフォルト値とgentypes例外が発生することにも気付きました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

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

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

gentypes => false、gentables => false

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

PL/SQL procedure successfully completed.
于 2011-06-16T06:14:42.260 に答える
2

ここに私のために働くコードがあります。user272735の答えは正しいです。コメントにすべてのコードを書き込めない限り(長すぎます)、別の答えを書きました。

/* Formatted on 21/08/2012 12:52:47 (QP5 v5.115.810.9015) */
DECLARE
   -- Local variables here
   res          BOOLEAN;
   tempXML      XMLTYPE;
   xmlDoc       XMLTYPE;
   xmlSchema    XMLTYPE;
   schemaURL    VARCHAR2 (256) := 'testcase.xsd';
BEGIN
   dbms_xmlSchema.deleteSchema (schemaURL, 4);
   -- Test statements here
   xmlSchema :=
      xmlType('<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb"
elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="root" xdb:defaultTable="ROOT_TABLE">
<xs:complexType>
<xs:sequence>
<xs:element name="child1"/>
<xs:element name="child2"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
');
    -- http://stackoverflow.com/questions/82047/validating-xml-files-against-schema-in-oracle-pl-sql
    dbms_xmlschema.registerschema(schemaurl => schemaURL,
                                  schemadoc => xmlSchema,
                                  local => true,
                                  gentypes => false,
                                  gentables => false
                                  );
   xmlDoc :=
      xmltype('<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="'
              || schemaURL
              || '"><child1>foo</child1><child2>bar</child2></root>');
   xmlDoc.schemaValidate ();
   -- if we are here, xml is valid
   DBMS_OUTPUT.put_line ('OK');
exception
    when others then
    DBMS_OUTPUT.put_line (SQLErrm);
END;
于 2012-08-21T11:14:56.757 に答える
2

ALTER SESSIONスキーマを登録するには、権限が付与されている必要があります。

于 2011-03-11T14:50:27.617 に答える
0

インストールの問題を乗り越えると、スキーマが大きくなると、特に他のスキーマを含むスキーマがある場合に、一部の Oracle バージョンで問題が発生します。9.2 でその問題があったことは知っていますが、10.2 または 11 についてはわかりません。

ただし、例のような小さなスキーマの場合は、うまくいくはずです。

于 2008-10-07T14:43:02.583 に答える
-2

私の記憶が正しければ、XDB (Oracle の XML データベース パッケージ) が正しくインストールされていない場合に、このエラー メッセージが表示されます。DBA にこれをチェックしてもらいます。

于 2008-09-17T13:56:46.897 に答える