Bases de Datos Avanzadas
Base de Datos Relacionales extendidas con
soporte XML -SGBDR-
Base de Datos XML Nativas -NXDBGeneralmente los datos se almacenan empleando SGBDR, y para gestionar y
consultarlos se utiliza el lenguaje SQL.
En la actualidad, se hace uso de XML para representar los datos de una
manera más natural, y necesitan un nuevo lenguaje para la gestión y
consulta de los datos; un lenguaje que tenga en cuenta la estructura de un
documento XML, así como los valores de sus datos.
Base de Datos Relacionales extendidas con
soporte XML -SGBDR-
Base de Datos XML Nativas -NXDBHoy en dia, es evidente la supremacía de los SGBDRs para almacenar,
actualizar y consultar datos haciendo uso del lenguaje SQL. Sin embargo,
actualmente se presentan situaciones en las que se hace necesaria la
utilización de datos XML.
Así nacen los SGBDR extendidas para dar soporte a XML, que además de dar
la posibilidad de almacenar este nuevo tipo de datos, también permite
gestionarlos a través de una extensión del lenguaje SQL tradicional.
SQL/XML
Oracle
•Permite almacenar los documentos XML en base de datos
objeto/relacionales, para consultar dichos documentos mediante XPath,
XQuery y presentar los datos SQL en un formato de documentos XML.
•El primer estándar SQL/XML (2003), se publicó por la ISO, como la
parte 14 del estándar SQL: ISO/IEC 9075-14:2003.
•Permite generar datos XML desde sus tablas relacionales de dos
maneras diferentes:
•Por un lado, haciendo uso de las funciones propias del SQL/XML
•Exportando en formato XML el resultado de una consulta SQL.
Funciones del estándar suministradas por
ORACLE SQL/XML:
Almacenamiento de datos XML, mediante el tipo
de dato denominado XMLType.
Crear tablas/columnas XMLType, basados o no en
esquemas XML.
Funciones propias de Oracle para generar
datos XML con datos procedentes de la BD
relacional relacionales:
• SYS_XMLGEN()
• XMLSEQUENCE()
• XMLCOLATTVAL()
• SYS_XMLAGG()
• XMLElement
• XMLForest
• XMLConcat
XMLAttributes
• XMLAgg
Funciones de manipulación de ORACLE:
utilizando XPath y/o XQuery:
•EXTRACT()
•EXTRACTVALUE()
•EXISTSNODE()
•XMLSEQUENCE()
•XMLQUERY() (en estándar)
•XMLTABLE() (en estándar)
•UPDATEXML()
•DELETEXML()
XMLELEMENT
XMLFOREST
XMLATTRIBUTES
•Crea un fragmento de un documento XML desde datos relacionales. Los
nombres de los elementos se insertan en la expresión. Los valores de las
columnas se convierten en valores de texto del elemento. Las instancias
anidadas de XMLELEMENT se utilizan para crear documentos XML bien
formados.
•Crea fragmentos de documentos XML desde datos relacionales. Por defecto,
cada nombre de columna se convierte en nombre de un elemento y cada
valor de columna en el valor de texto del elemento. Las instancias anidadas
de XMLELEMENT y XMLFOREST se utilizan para formar documentos
XML bien formados.
•Una expresión anidada de XMLELEMENT(). Proporciona una lista de
atributos para un elemento como pares de valores. Los nombres de los
atributos se pueden insertar dentro de la expresión. Por defecto, los
nombres de las columnas se convierten en nombres de atributos y los
valores de las columnas en valores de atributos.
XMLAGG
•Crea un agregado de fragmentos de un documento XML desde una
colección de objetos XMLType separados. SYS_XMLAGG anida el
resultado dentro del elemento raíz ROWSET, XMLAGG no hace esto.
•Produce también atributos para las columnas, pero con una diferencia
importante. La función XMLCOLATTVAL () produce un elemento
denominado column para cada valor de columna y un atributo
denominado name para cada nombre de columna. El valor de la columna
XMLCONCAT es el valor de texto del elemento.
La función XMLELEMENT(), permite que se especifique un nombre para el elemento
SELECT XMLELEMENT(“Nombre _elemento", XMLELEMENT(“Nombre_subelemento”,
nombre_columna)).getstringval() as "Resultado"
FROM Tabla;
Por cada fila seleccionada se crea un fragmento XML
<Nombre_elemento><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
<Nombre_elemento><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
<Nombre_elemento><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
La función getstringval recupera un
documento en forma de VARCHAR
(por defecto el tamaño del buffer es
de 4000 byte) getclobval() permite
trabajar con más de 4000 Bytes o
caracteres
Por cada fila seleccionada se crea un fragmento XML
La función XMLELEMENT(), permite que se especifique un nombre para el elemento
SELECT XMLELEMENT(“Nombre _elemento", XMLELEMENT(“Nombre_subelemento”,
funcion_agregadas(nombre_columna))).getstringval() as "Resultado"
FROM Tabla;
Por cada fila seleccionada se crea un fragmento XML
<Nombre_elemento><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
<Nombre_elemento><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
<Nombre_elemento><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
Consulta: Devolver el id de departamento junto a la cantidad de empleados, de
acuerdo a la siguiente estructura
<Departamento><ID>…</ID>
<Cant_empleados>…</Cant_empleados>
</Departamento>
Por cada fila seleccionada se crea un fragmento XML
SELECT XMLELEMENT(“Nombre _elemento", XMLATTRIBUTES(Nombre_columna as
“Nombre_atributo”),XMLELEMENT(“Nombre_subelemento”,nombre_columna)).getstringval()
as "Resultado"
FROM Tabla;
Por cada fila seleccionada se crea un fragmento XML
<Nombre_elemento Nombre_atributo=“Contenido de la columna es el
valor”><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
Nombre_elemento Nombre_atributo=“Contenido de la columna es el
valor”><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
Nombre_elemento Nombre_atributo=“Contenido de la columna es el
valor”><Nombre_subelemento>Contenido de la columna es el valor
textual</Nombre_subelemento></Nombre_elemento>
Por cada fila seleccionada se crea un fragmento XML
SELECT XMLFOREST(Nombre_columna1).getstringval() as “Resultado"
FROM Tabla;
Todos los elementos se encuentran anidados al mismo nivel. Está función, es una
forma fácil de retornar un fragmento que será parte de un documento XML
agregado o concatenado, pero no es útil para crear documentos XML por sí solo.
<Nombre_columna1><Contenido de la columna es el valor textual</Nombre_columna1>
<Nombre_columna1><Contenido de la columna es el valor textual</Nombre_columna1>
<Nombre_columna1><Contenido de la columna es el valor textual</Nombre_columna1>
SELECT XMLELEMENT(“Nombre_elemento_raiz",
XMLAGG(XMLELEMENT(“Nombre_subelemento“, Nombre_columna))).getstringval() as
"Resultado"
FROM Tabla;
La función XMLAGG agrega filas múltiples de resultado en un documento XML,
junto a la función XMLELEMENT permiten construir un documento XML.
<Nombre_elemento_raiz>
<Nombre_subelemento><Contenido de la columna es el valor textual</Nombre_subelemento>
<Nombre_subelemento><Contenido de la columna es el valor textual</Nombre_subelemento>
<Nombre_subelemento><Contenido de la columna es el valor textual</Nombre_subelemento>
</Nombre_elemento_raiz>
SELECT XMLELEMENT(“Nombre_elemento", XMLCOLATTVAL(
Nombre_columna1,Nombre_columna2)).getstringval()as "Resultado"
FROM Tabla;
Por cada fila seleccionada se crea un fragmento XML
<Nombre_elemento>
<column name = “Nombre_columna1">Contenido de la columna1 es el valor textual </column>
<column name = "Nombre_columna2"> Contenido de la columna2 es el valor textual
</column>
</Nombre_elemento>
<Nombre_elemento>
<column name = “Nombre_columna1">Contenido de la columna1 es el valor textual </column>
<column name = "Nombre_columna2"> Contenido de la columna2 es el valor textual
</column>
</Nombre_elemento>
Crea elemento/s denominado/s column para cada valor de columna/s y un
atributo denominado name para cada nombre de columna/s. El valor de la
columna es el valor de texto del elemento.
CREATE USER HR_XML
IDENTIFIED BY VALUES 'D199B3E88E3FA920'
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
PROFILE DEFAULT
ACCOUNT UNLOCK;
-- 1 Tablespace Quota for HR_XML
ALTER USER HR_XML QUOTA UNLIMITED ON USERS;
Create table hr_xml.empcom
(id number(6)primary key,
datos_emp XMLTYPE,
departamento number(4));
insert into hr_xml.empcom1(id,datos_emp,departamento)
Select employee_id,XMLELEMENT("datos_de_empleado",
XMLELEMENT("apellido_nombre",last_name||' '||first_name),
XMLELEMENT("mail",email)).getstringval(),department_id
From hr.employees;
EXTRACT
EXTACTVALUE
EXISTSNODE
• Retorna un fragmento de un documento XML en
un formato de tipo de dato XMLType desde una
expresión XPath.
• Retorna un valor escalar desde una expresión
XPath.
• Si el resultado de una expresión XPath devuelve
cualquier nodo, la función retorna verdadero.
SELECT Nombre_columna, extract(Nombre_columna_XMLTYPE,‘XPath’)
FROM Tabla_XML;
Nombre_columna
Nombre_columna_XMLTYPE
Contenido_columna
(oraxml)
Contenido_columna
(oraxml)
Consulta: Devolver el id y los datos de los empleados
Consulta: Devolver el id y el mail de los empleados como xml
Consulta: Devolver el id del empleado con mail JRUSSEL
SELECT Nombre_columna, extractvalue(Nombre_columna_XMLTYPE,‘XPath’)
FROM Tabla_XML;
Nombre_columna
Nombre_columna_XMLTYPE
Contenido_columna
Valor Textual de subelemento hoja
Contenido_columna
Valor Textual de subelemento hoja
Consulta: Devolver el id y el mail de los empleados
Consulta: Devolver el id del empleado con mail JRUSSEL
Consulta: Obtener los datos del empleado con mail JRUSSEL
SELECT Nombre_columna, Nombre_columna_XMLTYPE
FROM Tabla_XML
WHERE existsnode(Nombre_columna_XMLTYPE ,‘XPath’)=1;
Nombre_columna
Nombre_columna_XMLTYPE
Contenido_columna
(oraxml)
Contenido_columna
(oraxml)
Consulta: Devolver el id, datos del empleado y departamento del empleado con mail
JRUSSEL
XMLQUERY
• La función XMLQuery permite
construir o consultar datos XML.
• XMLQUERY (
• Expresión-XQuery
• [ PASSING { BY REF I BY VALUE }
argument-list ]
• [RETURNING { CONTENT I
SEQUENCE } [{ BY REF I BY VALUE
}]]
• NULL ON EMPTY I EMPTY ON
EMPTY)
SELECT Nombre_columna, XMLQUERY(‘XQUERY’
passing Nombre_columna_XMLTYPE returning content)
FROM Tabla_XML;
Nombre_columna
XML
Contenido_columna
(oraxml)
Contenido_columna
(oraxml)
Consulta: Devolver el id de departamento junto al apellido y nombre de los
empleados, de acuerdo a la siguiente estructura:
<datos_emp ayn=“valor_atributo"></datos_emp>
XMLTABLE
• La función XMLTABLE puede tomar datos
XML como entrada y producir una tabla
relacional como salida.
• Transforma datos XML en formato tabla.
• Evalúa una expresión XQuery o XPath “ el
patrón fila”.
• Cada ítem del resultado es una fila.
• Los valores de los elementos/atributos se
mapean a valores de columna usando
expresiones XPath “ el patrón columna”.
• El nombre y tipo de dato tienen que
especificarse.
SELECT Nombre_columna1,Nombre_columna2,XMLTABLE(‘XQUERY’
passing Nombre_columna_XMLTYPE
COLUMNS Nombre_columna1 tipo PATH ‘Nombre_elemento1 o @Nombre_atributo’,
Nombre_columna2 tipo PATH ‘Nombre_elemento2’ returning content)
FROM Tabla_XML;
Nombre_columna1
Nombre_columna2
Valor textual de elemento o Valor textual de elemento o
atributo
atributo
Valor textual de elemento o Valor textual de elemento o
atributo
atributo
Consulta: Obtener una tabla con los datos de los empleados
Consulta: Obtener una tabla con los datos del empleado con mail JRUSSEL
Descargar

Funciones de SQL/XML