tabla read insertar getstringval generar existsnode ejemplos desde consultar xml oracle ora-06512

read - Validación de archivos XML contra el esquema en Oracle PL/SQL



plsql xml (5)

Si mal no recuerdo, ese mensaje de error aparece cuando XDB (el paquete XML DataBase de Oracle) no está instalado correctamente. Haga que el DBA verifique esto.

Tengo un requisito para validar un archivo entrante contra un XSD. Ambos estarán en el sistema de archivos del servidor.

He visto dbms_xmlschema , pero he tenido problemas para hacerlo funcionar.

¿Podría ser más fácil hacerlo con algo de Java?
¿Cuál es la clase más simple que podría poner en la base de datos?

Aquí hay un ejemplo simple:

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;

Esto genera el siguiente error:

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


Una vez que superas los problemas de instalación, hay desafíos en algunas versiones de Oracle cuando los esquemas se agrandan, particularmente cuando tienes esquemas que incluyen otros esquemas. Sé que tuvimos ese problema en 9.2, no estoy seguro acerca de 10.2 u 11.

Sin embargo, para pequeños esquemas como su ejemplo, debería funcionar.


Actualizar

El registro del esquema XML requiere los siguientes privilegios:

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

Por alguna razón, no es suficiente si esos privilegios se otorgan indirectamente a través de roles, pero los privilegios deben otorgarse directamente a schema / user .

Respuesta original

También he notado que los valores predeterminados de los parámetros gentables y gentypes aumentan insufficient privileges excepción de insufficient privileges . Probablemente carezco de algunos privilegios para usar esas funciones, pero por el momento no entiendo bien lo que hacen. Me complace desactivarlos y la validación parece funcionar bien.

Me estoy ejecutando en Oracle Database 11g Release 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 => falso

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 => falso, gentables => falso

dbms_xmlschema.registerschema(schemaurl => name, schemadoc => xmltype(schema), local => true, gentypes => false, gentables => false ); PL/SQL procedure successfully completed.


Debe tener el privilegio ALTER SESSION otorgado para registrar un esquema.


aquí hay una pieza de código que funciona para mí. La respuesta de user272735 es correcta, escribí otra respuesta en la medida en que no puedo escribir todo el código en un comentario (demasiado tiempo).

/* 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://.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;