Ver Mensaje Individual
  #2 (permalink)  
Antiguo 29/11/2007, 12:55
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Re: Escribir resultado de una select en un fichero

Hola,

Este es un ejemplo muy basico de como utilizar el paquete UTL_FILE

Tengo la siguiente tabla de ejemplo.

Código:
SQL> desc t1
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 ID                                                 NUMBER
 NOMBRE                                             VARCHAR2(30)
 NACIMIENTO                                         DATE

SQL> select * from t1;

        ID NOMBRE                         NACIMIENT
---------- ------------------------------ ---------
         1 nombre 1                       01-JAN-70
         2 nombre 2                       28-DEC-71
         3 nombre 3                       08-DEC-75
         4 nombre 4                       06-JAN-78
         5 nombre 5                       24-DEC-79
         6 nombre 6                       31-DEC-89

6 rows selected.
Para empezar, creas un objeto DIRECTORY, en esta ubicacion se van a generar el o los ficheros.

Código:
SQL> create directory utl_data as '/home/oracle/scripts/data';

Directory created.
Despues creas un procedimiento que recorre una tabla y por cada registro escribe una linea en el fichero ASCII.

Código:
SQL> create or replace procedure p1 is
  2  
  3    line varchar2(500);
  4    file utl_file.file_type;
  5  
  6  begin
  7  
  8    --Abres el fichero t1.dat en el directorio UTL_DATA,
  9    --la w sigfinica en modo escritura y que lo cree si no existe.
 10    file := utl_file.fopen('UTL_DATA','t1.dat','w');
 11  
 12  
 13    --Defines un cursor for loop que recorre la tabla t1
 14    for rec in (select id, nombre, nacimiento from t1) loop
 15  
 16      --Generas la linea, agregando si es necesario, un delimitador de campo,
 17      --en este ejemplo elegi el |
 18      line := to_char(rec.id) || '|' || rec.nombre || '|' || to_char(rec.nacimiento,'dd/mm/yyyy');
 19  
 20      --Escribes la linea en el fichero
 21      utl_file.put_line(file,line);
 22  
 23    end loop;
 24  
 25    --Cierras el handler al fichero
 26    utl_file.fclose(file);
 27  
 28    exception
 29      when others then
 30        dbms_output.put_line(sqlerrm);
 31  
 32  end p1;
 33  /

Procedure created.
Ejecutas..

Código:
SQL> exec p1;

PL/SQL procedure successfully completed.
Y listo, ahora solo queda ver el contenido del fichero

Código:
oracle@buo:~/scripts/data> more t1.dat 
1|nombre 1|01/01/1970
2|nombre 2|28/12/1971
3|nombre 3|08/12/1975
4|nombre 4|06/01/1978
5|nombre 5|24/12/1979
6|nombre 6|31/12/1989
Este ejemplo solo soporta tipos de datos NUMBER, VARCHAR2, CHAR y DATE, es decir, no va a funcionar si tienes, por ejemplo, campos LONG o LOBs.

Tambien tienes la opcion de hacer un spool con el SQL*Plus.

Código:
SQL> set head off
SQL> set feed off
SQL> set echo off
SQL> set pages 0
SQL> spool t2.dat
SQL> select id || '|' || nombre || '|' || to_char(nacimiento,'dd/mm/yyyy') from t1;
1|nombre 1|01/01/1970
2|nombre 2|28/12/1971
3|nombre 3|08/12/1975
4|nombre 4|06/01/1978
5|nombre 5|24/12/1979
6|nombre 6|31/12/1989
SQL> spool off
Pero despues tendras que eliminar algunas lineas del fichero

Código:
oracle@buo:~/scripts/data> more t2.dat 
SQL> select id || '|' || nombre || '|' || to_char(nacimiento,'dd/mm/yyyy') from t1;
1|nombre 1|01/01/1970                                                           
2|nombre 2|28/12/1971                                                           
3|nombre 3|08/12/1975                                                           
4|nombre 4|06/01/1978                                                           
5|nombre 5|24/12/1979                                                           
6|nombre 6|31/12/1989                                                           
SQL> spool off

Saludos