Ver Mensaje Individual
  #2 (permalink)  
Antiguo 06/11/2007, 14:23
Avatar de matanga
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