Laboratorio XML y ORACLE Objetivo: Probar algunas opciones que ofrece el SGBD ORACLE para trabajar con XML. Usamos la aplicación SQLWorksheet que se encuentra en: <Inicio><Programas><Oracle-OraClient10g_home1><Application Development><SQLPlus Worksheet> Cuenta.: ABDXX Password ABDXX Service: Erreala-10g ? Para que en la aplicación SQLWorksheet con las consultas SQL se puedan leer filas largas de XML, modifica su configuración con las siguientes operaciones: >>> set long 1000 >>> set linesize 100 ? Crear las siguientes tablas: CREATE TABLE Departamentos (codigo number(4) primary key, nombre varchar2(20)); CREATE TABLE Empleados (dni number(8) primary key, nombre varchar2(20), apellido1 varchar2(20), apellido2 varchar2(20), departamento number(4) references Departamentos, telefono number(9)); ? Insertar tuplas en ambas tablas (introducir empleados sin teléfono) ? Probar las siguientes sentencias sabiendo que: Xmlelement(): crea un elemento XML Xmlattributes(): crea atributos XML, a partir de los nombres de las columnas Xmlforest(): crea elementos XML, a partir de los nombres de las columnas (elimina nulos) Xmlconcat(): a partir de una lista de valores XML crea un único valor XML Xmlagg(): combina una colección de filas y crea un valor XML (es una función de agregación) Ejemplos 1. SELECT XMLElement("Documento", Dni).extract('/*') From Empleados; 2. SELECT XMLElement("NombreEmpleado",nombre ||' '|| apellido1 ||' '|| apellido2).extract('/*') From Empleados; 3. SELECT XMLElement("NombreEmpleado", nombre ||' '|| apellido1 ||' '|| apellido2).extract('/*'), XMLElement("Documento", dni).extract('/*') From Empleados; 4. SELECT XMLElement("NombreEmpleado", XMLATTRIBUTES (dni AS "Documento"), nombre ||' '|| apellido1 ||' '|| apellido2).extract('/*') as Resultado From Empleados; 5. SELECT XMLElement("Emp", XMLElement ("NombreEmpleado", nombre ||' '|| apellido1 ||' '|| apellido2).extract('/*'), XMLElement("Documento", dni)) From Empleados; 6. Select XMLAGG( XMLElement ("NombreEmpleado", nombre ||' '|| apellido1 ||' '|| apellido2 )) From Empleados; ¿Cuál es la diferencia de resultado entre el ejemplo 2 y 6? 7. SELECT XMLForest (dni as "Documento").extract('/*') FROM Empleados; 8. SELECT XMLForest (telefono as "Telefono").extract('/*') FROM Empleados; 9. SELECT XMLForest (dni ||' '|| telefono as "Telefonos").extract('/*') FROM Empleados; 10. SELECT XMLConcat(XMLElement ("Nom", nombre), XMLElement ("Ape", apellido1)).extract('/*') COL FROM Empleados; ? Realizar la consulta que permita obtener en una sentencia XML para cada departamento su nombre y seguidamente el nombre y primer apellido de todos los empleados que tengan registrado un teléfono. /********************************************************************/ ? ? ? ? Crear la siguiente tabla con una columna de tipo XML CREATE TABLE TRABAJOS (Cod Number(4) PRIMARY KEY , Descripcion XMLTYPE); Ejecutar las siguientes instrucciones: o INSERT INTO TRABAJOS VALUES (1,’<lista><proyecto cod=”1” titulo=”Implementación BD”></proyecto>’); ¿Qué ocurre? o INSERT INTO TRABAJOS VALUES (9, '<lista><proyecto titulo="Implementacion BD"><organismo>Diputacion</organismo></proyecto></lista>'); o Visualizar con apariencia XML las tuplas introducidas Crear una nueva tabla a la que vamos a asociar un esquema XML CREATE TABLE ALUMNOSFISS(Cod Number(4) PRIMARY KEY, Alumno XMLTYPE) XMLType Column Alumno XMLSCHEMA "http://xmlns.oracle.com/xdb/schemas/ILLARRAMENDI/www.ehu.es/dbd" ELEMENT "elAlumno"; Insertar elementos en la tabla ALUMNOSFISS y visualizarlos. En la marca elAlumno debeis introducir como atributos los siguientes espacios de nombre: xmlns="http://www.ehu.es/dbd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ehu.es/dbd http://xmlns.oracle.com/xdb/schemas/ILLARRAMENDI/www.ehu.es/dbd" El XML Schema es el siguiente: <?xml version="1.0"? encoding="UTF-8"?> <xsd:schema targetNamespace="http://www.ehu.es/dbd" xmlns="http://www.ehu.es/dbd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> <xsd:element name="elAlumno" type="Alumno"/> <xsd:complexType name="Alumno"> <xsd:sequence> <xsd:element name="Nombre" type="xsd:string" /> <xsd:element name="Edad" type="xsd:integer" /> <xsd:element name="Asignatura" type="Asignatura" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> <xsd:complexType name="Asignatura"> <xsd:sequence> <xsd:element name="Titulo" type="xsd:string" /> <xsd:element name="Cuatrimestre" type="xsd:integer" /> </xsd:sequence> <xsd:attribute name="Cod" type="xsd:integer" /> </xsd:complexType> </xsd:schema>