Configurar el paquete (package) UTL_FILE en el init.ora en 10G

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;
This entry was posted in Administración Oracle and tagged , , , , . Bookmark the permalink.

Deja un comentario