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