Oracle ofrece el paquete UTL_FILE para usar/manipular archivos de PL/SQL. UTL_FILE es un conjunto de procedimientos y funciones simples para procesar archivos del sistema de archivos del sistema operativo, de Oracle, utilizando PL / SQL.
En la siguiente entrada de blog explicaré cómo modificar el init<XXX>.ora para poder utilizar el paquete UTL_FILE y que consideraciones debemos tener en cuenta.
Puedes ampliar información en la documentación oficial de Oracle:
http://docs.oracle.com/cd/B14117_01/appdev.101/b10802/u_file.htm
Comenzamos ….
En primer lugar me conecto al UNIX con el usario oracle y posteriormente a sqlplus con el usuario SYS …
(oracle) $ whoami oracle $ sqlplus /nolog
SQL*Plus: Release 10.2.0.4.0 - Production on Lun Ago 19 09:47:28 2013 Copyright (c) 1982, 2007, Oracle. All Rights Reserved. SQL> show user USER is ""
SQL> connect /as sysdba Connected.
Compruebo que soy SYS …
SQL> show user USER is "SYS"
Compruebo el valor que contiene utl_file_dir y veo que está vacio…
SQL> select name,value from v$parameter where name='utl_file_dir';
NAME
——————————————————————————–
VALUE
——————————————————————————–
utl_file_dir
Compruebo que tipo de parámetro es utl_file_dir para ver si lo puedo modificar en caliente o deberé bajar la base de datos …
SQL> col NAME format a50 col ISSYS_MODIFIABLE format a20; SELECT NAME, ISSYS_MODIFIABLE FROM V$PARAMETER WHERE name='utl_file_dir' ORDER BY 1;
NAME ISSYS_MODIFIABLE
————————————————– ——————–
utl_file_dir FALSE
FALSE: Indica que obligatoriamente la base de datos debe bajarse para poder efectuar el cambio. Por tanto, se trata de un parámetro estático y se puede modificar, pero su modificación implica cerrar la base de datos y volverla a abrir para que los lea del fichero de inicialización y pueda realizar el cambio. Por eso en scope ponemos spfile y no both.
Si usamos both nos dará el siguiente error:
SQL> alter system set utl_file_dir=’<directorio_o_ruta>’ scope=both
*
ERROR at line 1:
ORA-02095: specified initialization parameter cannot be modified
Puedes ampliar información de los parámetros de Oracle en esta otra entrada de blog (http://colacios.es/blog/WordPress3/tipos-de-parametros-en-oracle/).
Se hace así:
SQL> alter system set utl_file_dir='<directorio_o_ruta>' scope=spfile
Ejemplo:
SQL> alter system set utl_file_dir='/users/oracle/usuarioftp' scope=spfile System altered.
Ahora debo bajar la base de datos y volverla a levantar para que los cambios tengan efecto…
Primero pararé el listener para evitar conexiones …
$ lsnrctl stop
Ahora me conecto a sqlplus para bajar y levantar la base de datos …
$ sqlplus /nolog SQL> show user USER is "" SQL> connect /as sysdba; Connected.
Bajarla …
SQL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down.
Levantarla …
SQL> startup ORACLE instance started. Total System Global Area 1442840576 bytes Fixed Size 2069240 bytes Variable Size 738200840 bytes Database Buffers 687865856 bytes Redo Buffers 14704640 bytes Database mounted. Database opened.
Compruebo que se ha levantado …
SQL> show sga Total System Global Area 1442840576 bytes Fixed Size 2069240 bytes Variable Size 738200840 bytes Database Buffers 687865856 bytes Redo Buffers 14704640 bytes
Compruebo que el parámetro ha cogido el valor correspondiente …
SQL> select name,value from v$parameter where name='utl_file_dir';
NAME
——————————————————————————–
VALUE
——————————————————————————–
utl_file_dir
/users/oracle/usuarioftp
Ahora levanto el listener:
$ lsnrctl start
Nota:
Si se tienen que añadir más directorios se debe especificar como sigue en la sentencia alter system:
utl_file_dir = ‘/ora102/log’, ‘/escherdata/carbono/archivos’,'/cherdata/operational_reports/datos’, ‘/rdata/plata/static/log’
o bien puedes agregar el valor “*”
utl_file_dir = *
Evidentemente, antes de modificar todo lo anterior, previamente se han tenido que hacer los siguientes pasos:
Para usar paquete UTL_FILE, que es propiedad de SYS, tienes que conceder el privilegio EXECUTE para el usuario. Dale privilegio EXECUTE para el usuario requerido o público (todos los usuarios) de la siguiente manera:
grant execute on UTL_FILE to public;
El siguiente paso y no por ello menos importante es crear un directorio lógico (alias del directorio) de Oracle que apunte a un directorio físico en el sistema de archivos. Sin embargo, el alias del directorio sólo puede sercreado por el DBA (SYS o SYSTEM). Así que después de iniciar sesión como SYS, crear el alias de directorio para la carpeta de ORACLE y conceder permisos de lectura y escritura a PUBLIC como sigue:
create directory filesdir as '/users/oracle/usuarioftp'; grant read on directory filesdir to public; grant write on directory filesdir to public;