[ 2012-07-10 ]

Uso de directorios en Oracle Database

Utilizar directorios en una base Oracle es necesario por ejemplo cuando usamos tablas externas, datapump o el paquete utl_file.

Podemos consultar los directorios creados utilizando las tablas:
dba_directories o all_directories.

Veamos un ejemplo de utilización de directorios:

Creamos un directorio en Linux:

[oracle@server01]$ mkdir /opt/testdir


Creamos un directorio en Oracle apuntando al directorio Linux.

SQL> create or replace directory TESTDIR as '/opt/testdir';

Otrogamos permisos al usuario user1 para que pueda leer y escribir en el directorio.

SQL> grant, read, write on directory TESTDIR to user1;


Todo listo para utilizar  el directorio Oracle.

Nos conectamos SQL*Plus con el usuario user1

SQL> conn user1/passwd

Ejecutamos el siguiente código para crear y escribir un archivo:

SQL> set serveroutput on

DECLARE
  f utl_file.file_type;
BEGIN
  f := utl_file.fopen( 'TESTDIR', 'test_file.txt','w' );
  utl_file.put_line(f, 'esta es la linea 1');
  utl_file.put_line(f, 'esta es la linea 2');
  utl_file.fclose( f );
END;

SQL> PL/SQL procedure successfully completed.

Desde el sistema operativo verificamos:

[oracle@server01]$ cd /opt/testdir

[oracle@server01]$ ls -lrt
total 4
-rw-r--r--. 1 oracle asmadmin 38 Jun 23 19:25 test_file.txt


[oracle@server01]$ cat test_file.txt
esta es la linea 1
esta es la linea 2

Ahora vamos a utilizar un código para verificar desde la base de datos si el archivo existe en el directorio y es posible leerlo. Además si esto es factible, calcula su tamaño:


SQL> DECLARE
     l_exists     boolean;
     l_size       integer;
     l_block_size integer;
     BEGIN
       utl_file.fgetattr( 'TESTDIR',
                          'test_file.txt',
                           l_exists,
                           l_size,
                           l_block_size );
      if( l_exists )
       then
       dbms_output.put_line( 'El archivo existe y tiene un tamaño de:' || l_size );
       else
       dbms_output.put_line( 'El archivo no existe o no es visible por Oracle' );
       end if;
     END;

SQL> El archivo existe y tiene un tamaño de:38
SQL> PL/SQL procedure successfully completed.

Vemos que el tamaño es similar al visto desde el sistema operativo.

Otra ejemplo para un archivo que NO existe:

SQL> DECLARE
     l_exists     boolean;
     l_size       integer;
     l_block_size integer;
     BEGIN
       utl_file.fgetattr( 'TESTDIR',
                          'otro_file.txt',
                           l_exists,
                           l_size,
                           l_block_size );
      if( l_exists )
       then
       dbms_output.put_line( 'El archivo existe y tiene un tamaño de:' || l_size );
       else
       dbms_output.put_line( 'El archivo no existe o no es visible por Oracle' );
       end if;
     END;


SQL> El archivo no existe o no es visible por Oracle
SQL> PL/SQL procedure successfully completed.

Espero les resulte útil.
Saludos,

No hay comentarios:

Publicar un comentario