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;