Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Generar Desde Oracle Ficheros Xml

Estas en el tema de Generar Desde Oracle Ficheros Xml en el foro de Oracle en Foros del Web. Hola a tod@s! Estoy investigando como generar de una tabla con 2 campos ("nombre_alumno" y "datos_alumno") por cada registro crear un fichero xml el cual ...
  #1 (permalink)  
Antiguo 06/11/2007, 10:27
 
Fecha de Ingreso: noviembre-2007
Ubicación: SEVILLA
Mensajes: 4
Antigüedad: 16 años, 5 meses
Puntos: 0
Generar Desde Oracle Ficheros Xml

Hola a tod@s!
Estoy investigando como generar de una tabla con 2 campos ("nombre_alumno" y "datos_alumno") por cada registro crear un fichero xml el cual llevará de nombre el contenido del campo "nombre"(ana.xml...juan.xml...) y como contenido del fichero deberá ser el contenido del campo "datos" (datos personales, etc), que es ya codigo XML, del registro actual...y asi con todos los registros de mi tabla...alguien sabe como podría hacerlo?

Ya tengo en mi tabla los 2 campos el campo nombre_alumno y el campo datos_alumno que ambos son de tipo CLOB.



Código:
CREATE OR REPLACE PROCEDURE proce_xml_
IS
   CURSOR cur
   IS
   
      SELECT nombre, apellido1, apellido2, poblacion, provincia
        FROM alumnos ;

   w_alum   alumnos%ROWTYPE;
   CONTEXT   DBMS_XMLQUERY.ctxtype;
   qryctx    DBMS_XMLGEN.ctxhandle;
   RESULT    CLOB;
BEGIN
   OPEN cur;

   LOOP
      EXIT WHEN cur%NOTFOUND;

      FETCH cur
       INTO w_alum;

      CONTEXT := DBMS_XMLGEN.newcontext ('SELECT * FROM '||W_alum.nombre_alumno );
      RESULT := DBMS_XMLGEN.getxml (CONTEXT);

      INSERT INTO XML_ORACLE(NOMBRE_ALUMNO,DATOS)
           VALUES (W_alum.nombre_alumno,datos);
      DBMS_XMLGEN.closecontext (CONTEXT);
   END LOOP;

   CLOSE cur;
END;

Espero que alguien pueda ayudarme!!!muchas gracias de antemano!
  #2 (permalink)  
Antiguo 06/11/2007, 14:23
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Re: Generar Desde Oracle Ficheros Xml

Hola,

Veamos un ejemplo.

Código:
SQL> desc t10
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 NOMBRE                                             VARCHAR2(50)

SQL> select * from t10;

        ID NOMBRE
---------- --------------------------------------------------
         1 nombre 1
         2 nombre 2
         3 nombre 3
         4 nombre 4
Este es el codigo PL/SQL que transforma cada registro de la tabla en un fichero XML, no esta todo el codigo completo, pero es suficiente para empezar.

Código:
declare

	hctx   dbms_xmlgen.ctxhandle;
	xml    clob;
	vxml   varchar2(4000);
	len    integer := 1;
	pos    integer := 1;
	amount integer := 4000;

	xfile utl_file.file_type;

	user_id varchar2(10);
	user_file varchar2(10);

begin

	user_id := '1';
	user_file := '1.xml';

	--obtenemos el xml
	hctx := dbms_xmlgen.newContext('SELECT * FROM t10 where id =' || user_id);
	dbms_xmlgen.setRowsetTag(hctx, 'table');
	dbms_xmlgen.setRowTag(hctx, 'row');
	xml := dbms_xmlgen.getxml(hctx);

	--creamos y obtenemos el fichero
	xfile:= utl_file.fopen('/home/oracle/scripts/data',user_file,'w');

	--obtenemos la longitud del xml lob	
	len := dbms_lob.getlength(xml);

	while (pos <= len) loop
		vxml := dbms_lob.substr(xml, amount, pos);
		utl_file.put_line(xfile,vxml,TRUE);
		pos := pos + amount;
	end loop;

	utl_file.fclose(xfile);

end;
/

PL/SQL procedure successfully completed.
Y ahora veamos que se genera como archivo XML.

Código:
SQL> ho
oracle@buo:~> more /home/oracle/scripts/data/1.xml 
<?xml version="1.0"?>
<table>
 <row>
  <ID>1</ID>
  <NOMBRE>nombre 1</NOMBRE>
 </row>
</table>

Hasta aqui el codigo funciona para los casos de tablas con formatos, como por ejemplo este.

Código:
SQL> desc alumnos
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER(8)
 NOMBRE                                             VARCHAR2(100)
 APELLIDO                                           VARCHAR2(100)
 EDAD                                               NUMBER(3)
 DNI                                                VARCHAR2(10)
 DIRECCION                                          VARCHAR2(500)
 TELEFONO                                           VARCHAR2(20)
 BLABLABLA                                          VARCHAR2(100)


En tu caso en particular,

Esta parte me confunde, Ya tengo en mi tabla los 2 campos el campo nombre_alumno y el campo datos_alumno que ambos son de tipo CLOB.
¿Para que necesitas que NOMBRE_ALUMNO sea CLOB?, te comento que VARCHAR2 tiene una logitud maxima de 4000 bytes, y no creo que alguien tenga un nombre tan largo, este campo no deberia ser CLOB.

Y DATOS_ALUMNO es un CLOB, que contiene la info en formato String o en formato XML. Si los datos estan con formato de tipo string, tendras que hacer un parseo mucho mas complejo para transformarlo a XML. Si los datos estan en un XML bien formado, entonces esto se adapta asi


Código:
SQL> desc t11;  
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 DATOS                                              CLOB

SQL> select * from t11;

        ID DATOS
---------- ----------------------------------------
         1 <?xml version="1.0"?>
           <table>
            <row>
             <ID>1</ID>
             <NOMBRE>nombre 1</NOMBRE>
            <
Simplemente necesitas recorrer el CLOB y bajarlo a un fichero.

Código:
declare

	xml    clob;
	vxml   varchar2(4000);
	len    integer := 1;
	pos    integer := 1;
	amount integer := 4000;

	xfile utl_file.file_type;

	user_id number;
	user_file varchar2(10);

begin

	user_id := 1;
	user_file := '1.xml';

	--obtenemos el xml
	select datos into xml from t11 where id = user_id;

	--creamos y obtenemos el fichero
	xfile:= utl_file.fopen('/home/oracle/scripts/data',user_file,'w');

	--obtenemos la longitud del xml lob	
	len := dbms_lob.getlength(xml);

	while (pos <= len) loop
		vxml := dbms_lob.substr(xml, amount, pos);
		utl_file.put_line(xfile,vxml,TRUE);
		pos := pos + amount;
	end loop;

	utl_file.fclose(xfile);

end;
/
Lo que le falta al codigo es encerrarlo dentro de un gran loop, que seguramente va a ser un CURSOR con la consulta SELECT id FROM t10 y que por cada registro asigne el valor de las variables user_id y user_file, ademas de un manejador de excepciones.

Asegurate de que NOMBRE_ALUMNO sea unico, en caso contrario se te van a reemplazar los ficheros XML.

Saludos.

Última edición por matanga; 07/11/2007 a las 03:51
  #3 (permalink)  
Antiguo 12/11/2007, 04:47
 
Fecha de Ingreso: noviembre-2007
Ubicación: SEVILLA
Mensajes: 4
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Generar Desde Oracle Ficheros Xml

Muchas gracias por tu ayuda pero tengo un problemilla...no puedo generar el fichero porque no tengo permisos(estoy en el curro...). He creado una tabla temporal y le he insertado todos los datos correctamente pero necesito generar el fichero y np se porque no me reconoce el "xfile utl_file.file_type;" de tu ejemplo, me da error. Me han dicho que lo puedo hacer desde Forms para poder generar el archivo sin permisos...te pongo la funcion original, lo que no se si entenderas muy bien al no conocer el contenido de las tablas, pero lo basico es que CTABLA es el nombre de la tabla y el resto seran los datos que rellenan el segundo campo de mi tabla temporal.

Código:
CREATE OR REPLACE FUNCTION ISOT15.PASAR_A_XML2

return CLOB 

iS

   CURSOR cur
   IS
           
      SELECT  tbprs.ctabla
        FROM ssttbprs tbprs, ssttabla tabla
            WHERE tbprs.csubsi = 'TR' 
                AND tbprs.ctabla = tabla.ctabla
            ORDER BY tabla.norden ASC;
          
    w_tbprs   ssttbprs%ROWTYPE;
   
       CONTEXT   DBMS_XMLQUERY.ctxtype;
       qryctx    DBMS_XMLGEN.ctxhandle;
   
       RESULT    CLOB;
   
BEGIN
   OPEN cur;
   LOOP
   
      FETCH cur
        INTO w_tbprs;
        
      EXIT WHEN cur%NOTFOUND;
      
      CONTEXT := DBMS_XMLGEN.newcontext ('SELECT * FROM ' || w_tbprs.ctabla);
      RESULT := DBMS_XMLGEN.getxml (CONTEXT);
      
/*NO ME INSERTA LOS DATOS, EN EL INSERT INTO SIGUIENTE QUE NO ES TABLA TEMPORAL SÍ QUE ME LOS INSERTA, PERO EL SIGUIENTE INSERT ES EL QUE SE SUSTITUIRIA POR EL ARCHIVO*/
      INSERT INTO DATO_TABLA_XML(NOMBRE_TABLA, RESULTADO)
           VALUES (W_TBPRS.CTABLA, RESULT);
           
      DBMS_XMLGEN.closecontext (CONTEXT);
      
   END LOOP;
   
   CLOSE cur;
   
   CONTEXT := DBMS_XMLGEN.newcontext ('SELECT * FROM DATO_TABLA_XML');
   RESULT := DBMS_XMLGEN.getxml (CONTEXT);
   DBMS_XMLGEN.closecontext (CONTEXT);
  
/*AQUI IRIA LA INSERCION EN EL ARCHIVO .xml, PERO PARA PROBAR UTILIZO UNA TABLA QUE ME RECOGE LOS DATOS.*/
   INSERT INTO proce3(RESULTADO)
       VALUES (RESULT);
       
   COMMIT; 
        
   RETURN RESULT;    

EXCEPTION
   
    WHEN OTHERS THEN
        DBMS_OUTPUT.PUT_LINE ('Algún error tendrá.');        
   
END;


Estoy buscando tambien la solucion con TEXT_IO de Oracle Forms pero no s¡doy con la solucion ya que no estoy muy puesta en utilizar funciones en el Forms y mucho menos inventarme una asi de complicada...al menos para mi...Muchas Gracias!!
  #4 (permalink)  
Antiguo 12/11/2007, 08:24
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Re: Generar Desde Oracle Ficheros Xml

Hola,

Lo primero a decidir es desde donde vas a bajar los datos, en el ejemplo que deje lo hice dentro de la base de datos, utilizando el paquete de Oracle UTL_FILE, esto significa que los ficheros se van a generar en el servidor donde este instalado Oracle. Pero para poder trabajar con este paquete hay que configurar dos cosas.

1. El parametro de Oracle UTL_FILE_DIR='Directorio'.
2. Permisos de ejecucion sobre el paquete UTL_FILE al usuario de base de datos con el que estes trabajando.

Estas dos cosas se las tienes que pedir a tu Administrador de base de datos. Probablemente por problemas de permisos es que no te este compilado la linea xfile utl_file.file_type;.

Ahora, segun veo tu codigo, a partir de la linea

Código:
CONTEXT := DBMS_XMLGEN.newcontext ('SELECT * FROM ' || w_tbprs.ctabla);
RESULT := DBMS_XMLGEN.getxml (CONTEXT);
ya puedes bajar los datos al fichero XML, dado que tienes un CLOB (RESULT) con toda la informacion, hasta ahora no veo la necesidad de las tablas DATO_TABLA_XML y PROCE3.

Despues de que tengas los datos dentro de RESULT puedes utilizar..

Código:
--creamos y obtenemos el fichero
xfile:= utl_file.fopen('/home/oracle/scripts/data',user_file,'w');

--obtenemos la longitud del xml lob	
len := dbms_lob.getlength(xml);

while (pos <= len) loop
	vxml := dbms_lob.substr(xml, amount, pos);
	utl_file.put_line(xfile,vxml,TRUE);
	pos := pos + amount;
end loop;

utl_file.fclose(xfile);
Donde la variable xml es igual a RESULT.

Saludos
  #5 (permalink)  
Antiguo 13/11/2007, 02:05
 
Fecha de Ingreso: noviembre-2007
Ubicación: SEVILLA
Mensajes: 4
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Generar Desde Oracle Ficheros Xml

Muchas gracias Matanga!!, lo del permiso lo he intentado pero no me lo dan, es una empresa grande y por ahora soy la ultima mona...

La tabla proce3 es para comprobar que los datos se recogen bien en Result(que si que los recoge bien), y la tabla DATO_TABLA_XML es una tabla temporal que contiene tambien los datos de la select primera y es la que los contiene hasta el momento en que los datos pasan al fichero, pero aun no se porque al comprobar los datos despues de ejecutar la funcion en la tabla DATO_TABLA_XML no me aparece ningun dato pero en la de proce3 si que me aparecen...eso no es importante, ya que si puedo pasar los datos directamente al fichero, no necesito las tablas...

Ya intente hacer tu ejemplo pero me dan errores por culpa de los permisos y no creo que los consiga...si sabes de otra forma de hacerlo y me puedes orientar...me estoy leyendo miles de manuales pero no encuentro mucho al respecto...muchas gracias por tu ayuda!!!
  #6 (permalink)  
Antiguo 13/11/2007, 04:16
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Re: Generar Desde Oracle Ficheros Xml

Hola Ana,

El problema es que si no tienes permisos para hacerlo desde el lado de Oracle, tendras que enviar la informacion a una capa mas arriba, es decir, a algun provider/driver de base de datos, y programar la generacion del fichero XML en tu aplicacion.

En principio no se me ocurre otra forma de hacerlo desde la base de datos, todos los paquetes DBMS_* son server-side, lo que significa que siempre estaremos en la misma problematica, permisos.

Tambien puedes considerar algun tipo de SPOOL a un fichero del sqlplus, pero no creo que esto sea lo que estas buscando.

Si se me ocurre algo mas lo posteo.

Saludos.
  #7 (permalink)  
Antiguo 13/11/2007, 10:09
 
Fecha de Ingreso: noviembre-2007
Ubicación: SEVILLA
Mensajes: 4
Antigüedad: 16 años, 5 meses
Puntos: 0
Re: Generar Desde Oracle Ficheros Xml

Ya lo he medio solucionado, he utilizado el procedimiento con Forms Builder y la funcion TEXT_IO y UTL_FILE utilizando variables que tienen en el servidor disponibles para estos casos, yo no lo sabia y un compañero me ha estado ayudando con ella(una ayuda de 4 horas seguidas buscando la manera...hasta que dimos con ella...). Aún tengo que hacerle arreglos pero lo básico lo tengo ya...ahora me toca pensar de que manera hacerlo al reves, coger las partes que necesito del fichero XML para insertar los datos simples en la tabla y supongo que será tambien desde el Forms...Muchas gracias por tu ayuda y si necesitas algo...bueno no creo que me preguntes que aún se muy poco!!!pero si es sobre esto...intentaré responderte lo mejor posible!Gracias!!
  #8 (permalink)  
Antiguo 13/11/2007, 10:21
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 5 meses
Puntos: 85
Re: Generar Desde Oracle Ficheros Xml

Hola,

Gracias a ti por compartir la solucion, mucha suerte!!!

Saludos
  #9 (permalink)  
Antiguo 28/10/2008, 09:00
 
Fecha de Ingreso: octubre-2008
Mensajes: 1
Antigüedad: 15 años, 5 meses
Puntos: 0
Cargar Ficheros Xml a Oracle 9i URGENTE!!!

Hola! quisiera saber si alguien encontro el "problema inverso" a lo que se buscaba, es decir Cargar en diferentes tablas de un esquema de DB Oracle 9i a traves de un fichero XML, esto es segun la etiqueta de encabezado del fichero XML es la tabla adonde lo quiero cargar...
Muchas Gracias!
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:10.