Tratamiento XML en Oracle
Introduccin Este es un documento ha sido elaborado como gua para una realizar la creacin de un archivo xml utilizando las funciones de oracle Objetivos Mostrar detalladamente las funciones de oracle que permiten generar los archivos xmls Prerequisitos: Instalar el motor de base de datos oracle versin 9i o superior, en un ambiente de sistema operativo certificado para la instalacin del producto Creacin del esquema XDB A continuacin se detallan las funciones para la creacin de archivos xmls La Base de datos implementa un nmero de estandares basados en funciones que permiten al usuario realizar querys y retornar archivos xmls. El Estndar SQL/XML se define en los siguientes elementos
XML : Un tipo de dato para almacenar archivos xmls XMLAgg: Una funcion para agrupar, o agregar, datos XML agrupados por queries XMLAttributes: Una funcion utilizada para colocar Atributos en un elemento XML retornado por queries XMLConcat: Una funcion para concatenar 2 o mas valores XML XMLElement: Una Funcin para transformar un valor relacional en un elemento XML en la forma <elementName>valor</elementName> XMLForest: Una funcion para generar una lista, llamada forest,de un elemento XML para una lista de valores relacionales XMLNamespaces: Una funcion para declarar namespace en un elemento XML XMLSerialize: Una funcion para convertir un valor del XML a una cadena de caracteres
COMO APLICAR LAS FUNCIONES
CREAR UN ARCHIVO XML En el siguiente ejemplo el usuario puede utilizar XMLElement para generar un elemento de XML para cada atraccin turstica:
SELECT XMLElement("Attraction", attraction_name) FROM attraction;
XMLELEMENT("ATTRACTION",ATTRACTION_NAME) -----------------------------------------<Attraction>Pictured Rocks</Attraction> <Attraction>Da Yoopers ... </Attraction> <Attraction>Valley Camp ...</Attraction> ... XMLElement es una de las funciones ms importantes de SQL/XML. XMLElement es un identificador de la misma manera que un nombre de la tabla o un nombre de la columna es un identificador, para este caso se utilizan las comillas dobles en el query de XMLElement. Si el usuario desea un nombre del elemento, inclyalo dentro de comillas dobles. Es importante entender que la funcin de XMLElement devuelve un valor de tipo XMLType, no una cadena de caracteres. SELECT XMLElement("Attraction", XMLAttributes(government_owned AS GOV), XMLElement("Name",attraction_name), XMLElement("Location",location), XMLElement("URL",attraction_url)) FROM attraction; XMLELEMENT("ATTRACTION",XMLATTRIBUTES(GOV" --------------------------------------------------------------------<Attraction GOV="Y"> <Name>Pictured Rocks</Name> <Location>Munising</Location> <URL>[Link] </Attraction> <Attraction GOV="N"> <Name>Da Yoopers Tourist Trap</Name> <Location>Ishpeming</Location> <URL>[Link] </Attraction> <Attraction GOV="N"> <Name>Valley Camp Museum Ship</Name> <Location>Sault Ste. Marie</Location> <URL>[Link] </Attraction>
ELIMINANDO LOS POSIBLES ELEMENTOS NULOS
Cuando se est trabajando con datos relacionales, se debe considerar la posibilidad de encontrar valores nulos. Usando XMLElement, si un valor de la columna falta, da lugar a un elemento vaco. Si el usuario no desea tales elementos vacos en su XML, hay por lo menos dos soluciones. Una solucin que usted puede utilizar para evitar de crear elementos vacos en el XML es utilizar el CASE de SQL, para retornar valores apropiados.
SELECT XMLElement("Attraction", XMLAttributes(government_owned AS GOV), XMLElement("Name",attraction_name), XMLElement("Location",location), XMLElement("URL",attraction_url)) FROM attraction WHERE attraction_name='Mackinac Bridge'; XMLELEMENT("ATTRACTION",XMLATTRIBUTES(GOV --------------------------------------------------------------------<Attraction GOV="Y"> <Name>Mackinac Bridge</Name> <Location/> <URL>[Link] </Attraction> En este ejemplo cada expresion del CASE asegura un resultado nulo cuando la columna del query es nula y pasa los valores no nulos a las funciones XMLElement. SELECT XMLElement("Attraction", XMLAttributes(government_owned AS GOV), CASE WHEN attraction_name IS NULL THEN NULL ELSE XMLElement("Name",attraction_name) END, CASE WHEN location IS NULL THEN NULL ELSE XMLElement("Location",location) END, CASE WHEN attraction_url IS NULL THEN NULL ELSE XMLElement("URL",attraction_url) END) FROM attraction WHERE attraction_name='Mackinac Bridge'; XMLELEMENT("ATTRACTION",XMLATTRIBUTES(GOV --------------------------------------------------------------------<Attraction GOV="Y"> <Name>Mackinac Bridge</Name> <URL>[Link] </Attraction> Otra manera de evitar de crear elementos vacos de XML es utilizar la funcin de XMLForest. En trminos de XML, los elementos jerarquizados por debajo de la <Attraction> se pueden referir con "Forest" XMLForest le permite generar un forest de elementos con apenas una llamada de la funcin. Al generar esos elementos, XMLForest salta elementos con valores nulos. En el siguiente ejemplo el XMLForest no produce el elemento nulo de la <location> en el resultado del query: SELECT XMLElement("Attraction",
XMLAttributes(government_owned AS GOV), XMLForest(attraction_name AS "Name", Location AS "Location", attraction_url AS "URL")) FROM attraction WHERE attraction_name='Mackinac Bridge';
XMLELEMENT("ATTRACTION",XMLATTRIBUTES(GOV ------------------------------------------------<Attraction GOV="Y"> <Name>Mackinac Bridge</Name> <URL>[Link] </Attraction> AGREGANDO ELEMENTOS DE XML El usuario puede agregar los datos de cierta manera para recoger toda la informacin en un documento. Usted puede hacer eso usando la funcin de XMLAgg conjuntamente con un GROUP BY XMLAgg es una funcin agregada, como el minimo, el mximo, y AVG. La Clave para usarlo es agrupar sus datos sobre un cierto valor comn. En el siguiente ejemplo se agrupan los datos por nombre de la ciudad. La funcin de XMLAgg despus toma todos los elementos individuales del tag <attraction> para una determinada ciudad, los concatena, y los vuelve un solo valor de tipo XMLType. Ese valor entonces alimenta uno nuevo, incluyendo la llamada de la funcin de XMLElement que genera el elemento del <County>. El XMLAttributes es utilizado para generar valores mltiples, genera tres atributos: uno para el nombre de la ciudad y dos que sealan a los esquemas de XML con los cuales se conforma el documento. SELECT XMLElement("County", XMLAttributes(c.county_name AS "Name", '[Link] AS "xmlns:xsi", '[Link] AS "xsi:noNamespaceSchemaLocation"), XMLAgg( XMLElement("Attraction", XMLAttributes(government_owned AS GOV), XMLForest(a.attraction_name AS "Name", [Link] AS "Location", a.attraction_url AS "URL")))) FROM county c INNER JOIN attraction a ON c.county_name = a.county_name GROUP BY c.county_name;
XMLELEMENT("COUNTY",XMLATTRIBUTES(C.COUNTY_NAMEAS"NAME",'HTTP://WWW. ---------------------------------------------------------------------<County Name="Alger" xmlns:xsi="[Link] xsi:noNamespaceSchemaLocation="[Link] <Attraction GOV="Y">
<Name>Pictured Rocks</Name> <Location>Munising</Location> <URL>[Link] </Attraction> <Attraction GOV="Y"> <Name>Valley Spur</Name> <Location>Munising</Location> <URL>[Link] </Attraction> </County> ... <County Name="Marquette" xmlns:xsi="[Link] xsi:noNamespaceSchemaLocation="[Link] <Attraction GOV="N"> <Name>Da Yoopers Tourist Trap</Name> <Location>Ishpeming</Location> <URL>[Link] </Attraction> <Attraction GOV="N"> <Name>Ski Hall of Fame</Name> <Location>Ishpeming</Location> <URL>[Link] </Attraction> </County>
ALMACENAR UNA VISTA XML El usuario puede crear una vista utilizado como base un query SQL/XML CREATE OR REPLACE VIEW ATTRACTION_XML OF XMLType WITH OBJECT ID ( extractValue(sys_nc_rowinfo$,'/County/@Name') ) from columns (c.County_name) AS SELECT XMLElement("County", XMLAttributes(c.county_name AS "Name", '[Link] AS "xmlns:xsi", '[Link] AS "xsi:noNamespaceSchemaLocation"), XMLAgg( XMLElement("Attraction", XMLAttributes(government_owned AS GOV), XMLForest(a.attraction_name AS "Name", [Link] AS "Location", a.attraction_url AS "URL")))) x FROM county c INNER JOIN attraction a ON c.county_name = a.county_name GROUP BY c.county_name;
El siguiente ejemplo permite crear un repositorio para cada archivo XML DECLARE CURSOR attractions_key IS SELECT DISTINCT county_name FROM attraction; xmlref REF XMLType; result BOOLEAN; BEGIN FOR key_rec IN attractions_key LOOP SELECT MAKE_REF(attraction_xml, key_rec.county_name) INTO xmlref FROM dual; result := DBMS_XDB.createResource( '/ATTRACTIONS/' || key_rec.county_name || '.xml' ,xmlref); END LOOP; END; /