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.