PDF de programación - Manejando Binary XML en Oracle Database 11gR2

Imágen de pdf Manejando Binary XML en Oracle Database 11gR2

Manejando Binary XML en Oracle Database 11gR2gráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 21 de Febrero del 2018)
403 visualizaciones desde el 21 de Febrero del 2018
241,9 KB
18 paginas
Creado hace 8a (05/01/2013)
Manejando Binary XML en Oracle Database 11gR2

Por Francisco Riccio



Introducción

XML es un lenguaje diseñado para estructurar documentos con la finalidad de intercambiar información

entre diferentes plataformas.

Oracle Database desde la versión 9iR2 nos proporciona un tipo de dato nativo llamado XMLTYPE; el cual

nos permite albergar información en formato XML con soporte a XSD (esquema de validación), XSLT

(transformaciones de documentos), XPATH, XQUERY, indexamiento y particionamiento a documentos

XML. En las versiones Oracle Database 9i y 10g los documentos XML se almacenan como CLOB

internamente pero a partir de la versión Oracle Database 11g se ha creado una nueva forma de

almacenar los documentos XML, dicho almacenamiento es en formato binario (Binary XML). Este nuevo

modo de almacenar es más eficiente en el consumo de espacio y en el tiempo de respuesta en el acceso

a los datos. Binary XML es el modo de almacenar por default a partir de la versión 11.2.0.2.

Debemos tener presente que albergar información en formato XML en nuestra base de datos da la

posibilidad de romper modelos altamente relacionales en modelos relacionales/jerárquicos

disminuyendo una serie de tablas normalizadas en nuestro diseño.

En el ejemplo a implementar se creará una tabla llamada RESERVA que almacenará los pedidos de un

cliente, dichos pedidos serán almacenados en un campo XML con almacenamiento binario sobre una

base de datos versión 11.2.0.3.

Implementación

a) Validación del componente XDB

El trabajo en XML con Oracle Database se hace a través del componente XDB. Este componente

permite albergar información de tipo XMLType (tipo de dato nativo para XML).

Asimismo el componente XDB mantiene un repositorio llamado XML DB Repository que
permite organizar y manejar los documentos XML en forma de archivos y carpetas, los cuales
son llamados recursos. Debemos pensar en este repositorio como si fuera un filesystem que se
encuentra internamente en nuestra base de datos.











1

Se adjunta un gráfico mostrando los 2 sub-componentes explicados que conforman el
componente XDB de la base de datos.

Para validar el status de este componente consultamos el siguiente query:

SQL> select comp_name, status from dba_registry where comp_name='Oracle XML Database';

El status debe devolver el valor de VALID.



Ejemplo:





b) Creando el Esquema de Validación

Para dicha implementación, primero crearemos un esquema de validación de documentos XML

(XSD) con la finalidad de que todo documento XML ingresado cumpla cierta estructura y

condiciones.

Acorde a nuestro ejemplo, necesitaríamos crear un esquema de validación que solo permita el

ingreso de pedidos que se compongan de 5 elementos: fecha, precio unitario (pu), cantidad,

descripción y tipo de pedido. Donde el elemento Pedido tiene un atributo de tipo entero. Cada

elemento tiene su propio tipo de dato y algunas reglas de negocio por ejemplo: el atributo tipo

solo puede albergar los valores A, B y C; asimismo el elemento cantidad solo puede albergar

valores enteros comprendidos de 0 a 50.

Cualquier documento XML debe cumplir con dicha especificación y será validado al momento

de ser insertado en la tabla RESERVA que crearemos más adelante.



2

Se presenta el documento XSD que registraremos en la base de datos:





Para registrar el documento XSD en la base de datos lo hacemos a través del procedure
DBMS_XMLSCHEMA.REGISTERSCHEMA:

begin

DBMS_XMLSCHEMA.REGISTERSCHEMA(SCHEMAURL=>'pedidos.xsd', SCHEMADOC=>'<?xml

version="1.0" encoding="utf-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="pedidos">

<xs:complexType>

3



















<xs:sequence>

<xs:element maxOccurs="unbounded" name="pedido">

<xs:complexType>

<xs:sequence>

<xs:element name="fecha" type="xs:string" />



<xs:element name="pu" type="xs:decimal" />





<xs:element name="cantidad" default="1">

<xs:simpleType>

<xs:restriction base="xs:unsignedByte">



<xs:minInclusive value="0"/>

<xs:maxInclusive value="50"/>

</xs:restriction>











</xs:simpleType>

</xs:element>

<xs:element name="descripcion" type="xs:string"/>

<xs:element name="tipo">

<xs:simpleType>

<xs:restriction base="xs:string">



<xs:enumeration value="A"/>

<xs:enumeration value="B"/>

<xs:enumeration value="C"/>

</xs:restriction>

</xs:simpleType>

</xs:element>

</xs:sequence>









4





<xs:attribute name="cod" type="xs:integer" use="required"/>













</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>', LOCAL=>true, GENTYPES=>false, GENBEAN=>false, GENTABLES=>false,

FORCE=>false, OPTIONS=>DBMS_XMLSCHEMA.REGISTER_BINARYXML, OWNER=>USER);

commit;

end;

/



Se detallan algunos de los parámetros:

a) Local, si el valor es true el documento XSD se guardará dentro del componente XDB en la carpeta

/sys/schemas/<owner>/. En caso contrario se guardará en la carpeta /sys/schemas/PUBLIC/.





5

b) Gentypes, al crear el archivo XSD se creará un tipo de Object Table que se basará en las reglas del

esquema cuando se le asigne el valor de true. En nuestro caso posteriormente crearemos la tabla de

forma manual, por dicha razón se ha colocado el valor de false.

c) Genbeans, si su valor es true se creará Java Beans al crear el archivo XSD.

d) Gentables, al crear el archivo XSD se creará una tabla que se basará en las reglas del esquema si se le

asigna el valor de true.

e) Force, si se coloca el valor de true no dará error en caso exista problemas en registrar el archivo XSD.

Es importante colocar la opción: DBMS_XMLSCHEMA.REGISTER_BINARYXML si es que pensamos

almacenar los documentos en Binary XML. Si no agregamos está opción y queremos crear una tabla que

use almacenamiento en Binary XML tendremos el siguiente error:

Asimismo podemos ver como el archivo XSD (pedidos.xsd) ha sido creado dentro del XML DB Repository

después de ser registrado:



Debemos configurar los puertos de XDB para acceso FTP o HTTP si deseamos visualizar o manipular los

archivos dentro de XML DB Repository por dichos protocolos.

Esto lo realizamos mediante el paquete dbms_xdb, ejemplo:







6



Se adjunta un ejemplo de cómo deben ser los documentos XML que se ingresarán en la tabla
RESERVA cumpliendo con el esquema de validación.



Nota: Debemos recordar que otra manera de poder validar documentos XML es mediante DTD, pero a

diferencia de los esquemas de validación, los DTD no siguen una sintaxis XML (nacieron basado en el

ISO 8879 para el lenguaje SGML y no para XML) y además no permite especificar los tipos de datos de

los elementos, por dicha razón la recomendación es usar esquemas de validación.



c) Creando la tabla Reserva

SQL> CREATE TABLE FRICCIO.RESERVA(id number, pedido xmltype)

XMLTYPE COLUMN pedido

STORE AS BINARY XML

XMLSCHEMA "http://xmlns.oracle.com/xdb/schemas/FRICCIO/pedidos.xsd"

ELEMENT "pedidos";







7

Hemos creado una tabla llamada RESERVA que se compone de un campo llamado pedido de tipo

XMLTYPE el cual le estamos especificando que será almacenado como Binary XML. Recordemos que a

partir de la versión 11.2.0.2 hacia delante, éste será el default. También indicamos que el campo pedido

será validado por el esquema pedidos.xsd que previamente lo hemos creado.

Nota: El tipo de dato XMLTYPE almacenado como Binary XML se guarda internamente como un

SecureFile LOB automáticamente en versión Oracle Database 11.2.0.2. En caso no pueda crearse de esa

manera lo hará como Basic LOB. Recordemos que no será posible la creación de objetos SecureFile LOB

cuando el tablespace no está configurado como ASSM ó el parámetro DB_SECUREFILE está en FALSE.



Ingresaremos un documento XML que no cumpla la especificación del esquema XSD definido para ese

campo:



En este ejemplo vemos que la operación de INSERT falla porque el documento XML no cumple con la

especificación definida en el archivo XSD. En este caso faltó el atributo "cod" de cada elemento Pedido,

donde el atributo lo hemos configurado como requerido.

Lo corregimos y veremos que ahora si se registra:



8

Nota: Es posible insertar un documento a partir de un archivo XML existente en el Sistema Operativo o



en el XML DB Repository, ejemplo:

SQL> INSERT INTO <tabla>

VALUES (XMLType(bfilename('<DIR>','<archivo.xml>'),nls_charset_id('AL32UTF8')));



d) Creación de Índices

Para indexar columnas cuyo almacenamiento es Binary XMLType lo podemos hacer mediante: índices

basado en funciones ó índices de tipo XML Index.

En My Oracle Support (MOS) Nota: 742192.1 (Indexing Binary XML Columns), se específica que no está
asegurado el uso de índices basado en funciones en campos almacenados como Binary XML, por lo cual

la recomendación es crearlo como XML Index.

XML Index es un nuevo tipo de índice a partir de la versión Oracle Database 11g.

Ejemplo de su creación:

SQL> create index IDX_RESERVA on RESERVA(pedido) INDEXTYPE is XDB.XMLINDEX;



El problema con este tipo de creación por default es que creará índices por cada elemento que tenga el

documento XML de modo que podría perjudicarnos en espacio.



9

Para nuestro ejemplo solo indexaré el elemento pu (precio unita
  • Links de descarga
http://lwp-l.com/pdf8944

Comentarios de: Manejando Binary XML en Oracle Database 11gR2 (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad