Pessoal, precisando gerar um arquivo, aquelas coisas que precisamos sempre recorrer ao passado, mas que é muito funcional. Deixo aqui o que fiz e alguns links para maiores informações, principalmente na LEITURA de arquivos.
Para usar a gravação de arquivos em disco via package e/ou procedure, precisamos primeiramente verificar o parametro UTL_FILE_DIR que mostra em quais diretórios temos permissão de gravar arquivos.

SQL> show parameters UTL_FILE_DIR
 NAME TYPE VALUE
 ------------------------------------ ----------- ------------------------------
 utl_file_dir string
 

Após verificar que em nenhum precisamos realizar a alteração, para isso podemos fazer da forma abaixo:

SQL> shutdown immediate;
 Banco de dados fechado.
 Banco de dados desmontado.
 Instancia ORACLE desativada.
 
 SQL> startup mount;
 Instancia ORACLE iniciada.
 Total System Global Area 1610612736 bytes
 Fixed Size 2084296 bytes
 Variable Size 1023410744 bytes
 Database Buffers 570425344 bytes
 Redo Buffers 14692352 bytes
 Banco de dados montado.
 
 SQL> alter system set utl_file_dir = '*' scope=spfile;
 Sistema alterado.
 
 SQL> shutdown
 ORA-01109: banco de dados não aberto
 Banco de dados desmontado.
 Instancia ORACLE desativada.
 
 SQL> startup
 Instancia ORACLE iniciada.
 Total System Global Area 1610612736 bytes
 Fixed Size 2084296 bytes
 Variable Size 1023410744 bytes
 Database Buffers 570425344 bytes
 Redo Buffers 14692352 bytes
 Banco de dados montado.
 Banco de dados aberto.
 

Também podemos fazer a alteração do parametro e reiniciar a instância:

SQL> alter system set utl_file_dir = '*' scope=spfile;
 Sistema alterado.

SQL> shutdown immediate;
 Banco de dados fechado.
 Banco de dados desmontado.
 Instancia ORACLE desativada.

 SQL> startup
 Instancia ORACLE iniciada.
 Total System Global Area 1610612736 bytes
 Fixed Size 2084296 bytes
 Variable Size 1023410744 bytes
 Database Buffers 570425344 bytes
 Redo Buffers 14692352 bytes
 Banco de dados montado.
 Banco de dados aberto.
 

Agora vamos ver como está o parâmetro UTL_FILE_DIR alterado:

SQL> show parameters UTL_FILE_DIR

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
utl_file_dir string *

O * mostra que podemos gravar em qualquer lugar, aonde o usuário Oracle tenha permissão de SO.

Agora vamos dar a permissão de execute para o PACOTE UTL_FILE:

SQL> grant execute on UTL_FILE to USUARIO;
 Concessão bem-sucedida.

Agora vejam o exemplo da procedure que vai gerar a saida do meu SQL no SO:

Procedure Sp_Gera_Email_Txt As
Lista_Email Utl_File.File_Type;
Begin
Lista_Email := Utl_File.Fopen('/tmp', 'email.txt', 'W');
 -- Esse FOR aqui é do SQL
 For Plinha In (Select Email
 From Usuarios
 Where Email Is Not Null)
 Loop
 Utl_File.Put_Line(Lista_Email, Plinha.Email);
 End Loop;
Utl_File.Fclose(Lista_Email);
End Sp_Gera_Email_Txt;

Também podemos trabalhar a leitura de arquivos, nesses links abaixo você encontra mais exemplos sobre arquivos com UTL_FILE.

Mais info:
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm
http://eduardolegatti.blogspot.com.br/2009/12/um-pouco-do-pacote-utlfile-dbmslob-e.html
http://www.oraclehome.com.br/2012/02/13/como-ler-e-gravar-arquivos-textos-pelo-oracle-10g-ou-superior/