Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

Listar Un Directorio

Estas en el tema de Listar Un Directorio en el foro de Oracle en Foros del Web. Tengo creado un directorio en Oracle. Mas info aqui: http://www.psoug.org/reference/directories.html La cuestion es que con la libreria Oracle UTL_FILE puedo acceder a ficheros de dicho ...
  #1 (permalink)  
Antiguo 27/12/2007, 05:33
 
Fecha de Ingreso: septiembre-2004
Mensajes: 191
Antigüedad: 20 años, 3 meses
Puntos: 1
Listar Un Directorio

Tengo creado un directorio en Oracle. Mas info aqui: http://www.psoug.org/reference/directories.html

La cuestion es que con la libreriaOracle UTL_FILE puedo acceder a ficheros de dicho directorio, para leerlos.
El problema es que necesito saber su nombre exacto, ya que esa libreria no tiene ninguna utilidad para listar contenidos de ficheros.

Alguien sabe si existe alguna libreria o algun metodo para poder listar los ficheros que contiene el directorio???
  #2 (permalink)  
Antiguo 27/12/2007, 12:01
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Re: Listar Un Directorio

Hola,

La forma, rara debo decir, en que lo tengo resuelto es:

Creo un procedimiento bajo el esquema de SYS, esto lo hago por un tema de privilegios, despues otorgo privilegios de execute al usuario que va a utilizar este procedimiento.

Código:
SQL> conn / as sysdba
Connected.
SQL> show user
USER is "SYS"

SQL> create or replace procedure get_directory_files
  2   (dir in out varchar2, c1 out sys_refcursor)
  3  as
  4  
  5  ns VARCHAR2(1024);
  6  
  7  BEGIN
  8  
  9  SYS.DBMS_BACKUP_RESTORE.searchFiles(dir, ns);
 10  open c1 for SELECT FNAME_KRBMSFT FROM X$KRBMSFT;
 11  
 12  END;
 13  /

Procedure created.

SQL> grant execute on get_directory_files to oracle;

Grant succeeded.
Una vez creado el procedimiento, lo pruebo con un pequeño bloque PL/SQL, la idea es llamar al procedimiento de sys y que devuelva un cursor con el nombre de todos los ficheros del directorio.

Código:
SQL> conn /
Connected.
SQL> show user
USER is "ORACLE"

SQL> set serveroutput on size 10000
SQL> 
SQL> declare
  2  
  3   c1 sys_refcursor;
  4   file_name varchar2(400);
  5   dir varchar2(400);
  6  
  7  begin
  8  
  9   dir := '/home/oracle/scripts/data';
 10   sys.get_directory_files(dir,c1);
 11  
 12   fetch c1 into file_name;
 13   while c1%found loop
 14    dbms_output.put_line(file_name);
 15    fetch c1 into file_name;
 16   end loop;
 17  
 18  end;
 19  
 20  /
/home/oracle/scripts/data/nombres.dat
/home/oracle/scripts/data/control.ctl
/home/oracle/scripts/data/afiedt.buf

PL/SQL procedure successfully completed.
Saludos
  #3 (permalink)  
Antiguo 27/12/2007, 13:41
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Listar Un Directorio

Eres un gurú Matanga.

Tomo nota de esto porque seguro que me sirve cualquier dia.

De todas maneras, no recomiendo a nadie crear nada en la cuenta de SYS, SYS es lo que es y para lo que es. En su cuenta no se debe de crear nada. Si es por temas de permisos y demas, te conectas como SYS ó SYSTEM y das los grants que corresponda.
  #4 (permalink)  
Antiguo 27/12/2007, 14:00
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Re: Listar Un Directorio

Hola,

Cita:
De todas maneras, no recomiendo a nadie crear nada en la cuenta de SYS, SYS es lo que es y para lo que es. En su cuenta no se debe de crear nada. Si es por temas de permisos y demas, te conectas como SYS ó SYSTEM y das los grants que corresponda.
Estoy totalmente de acuerdo con esto, el problema son los grants sobre X$KRBMSFT, hace unos meses atras encontre un codigo en la web para leer los ficheros del filesystem y lo adapte a lo que necesitaba, la verdad es que no le di mucho tiempo para analizar el problema.

Si necesitan la version orignial, esta en http://www.chrispoole.co.uk/tips/plsqltip2.htm

Saludos
  #5 (permalink)  
Antiguo 27/12/2007, 16:47
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Listar Un Directorio

Tomo nota del link, esto me puede ser muy util.

Gracias socio
  #6 (permalink)  
Antiguo 28/12/2007, 04:15
 
Fecha de Ingreso: septiembre-2004
Mensajes: 191
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: Listar Un Directorio

Interesante matanga, muchas gracias. Hemos comprobado en un Oracle instalado en Windows accediendo a un directorio de un sistema windows.

Un inconveniente que le veo es que el PL se crea para el usuario SYS, aunque me imagino que dandonle permisos lo podra ejecutar un usuario normal.

Ahora viene otro problemilla, ya que aunque nuestro entorno de desarrollo es un sistema windows, el entorno de produccion es un entorno linux. Vamos a hacer la prueba en un entorno linux total, teniendo la base de datos en linux y accediendo a un directorio linux pero por lo que veo en la especificacion del paquete oracle comenta que no funciona:

http://download.oracle.com/docs/cd/A...6/dbms_bac.htm


Cita:
DBMS_BACKUP_RESTORE
The DBMS_BACKUP_RESTORE package has a PL/SQL procedure to normalize filenames on Windows NT platforms.
Note: Do not use this procedure on Oracle releases prior to 8.1.6 or on UNIX-based Oracle installations.

un saludo
  #7 (permalink)  
Antiguo 28/12/2007, 08:13
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Re: Listar Un Directorio

Hola,

Cita:
Un inconveniente que le veo es que el PL se crea para el usuario SYS, aunque me imagino que dandonle permisos lo podra ejecutar un usuario normal.
Estoy de acuerdo con esto, ya lo he comentado en el post anterior. Para poder crear el procedimiento get_directory_files sobre un usuario cualquiera hay que otorgarle dos privilegios

1. grant execute on dbms_backup_restore to usuario
2. grant select on X$KRBMSFT to usuario

En el punto 2 es donde tuve problemas, pero no le dedique tiempo a resolverlo y como alternativa decidi crear el procedimiento bajo SYS.

Cita:
The DBMS_BACKUP_RESTORE package has a PL/SQL procedure to normalize filenames on Windows NT platforms.

Note: Do not use this procedure on Oracle releases prior to 8.1.6 or on UNIX-based Oracle installations.
En cuanto a esto, supongo que se esta refiriendo al procedimiento NORMALIZEFILENAME, pero en ningun momento lo estoy utilizando, en principio todas las operaciones sobre el filesystem son de solo lecutra, asi que no deberia haber problemas, de todos modos recomiendo una cantidad prudente de testing antes de implementarlo en produccion.

El link posteado que hace referencia a la documentacion de Oracle es sobre la version 8i, deberias ver que hay sobre la 10g, aunque el problema de este paquete es que esta poco o nada documentado.

Saludos
  #8 (permalink)  
Antiguo 28/12/2007, 11:18
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Listar Un Directorio

Solo por curiosidad, compi.
¿ A que problemas te refieres al hablar de esto :

==========================

En el punto 2 es donde tuve problemas, pero no le dedique tiempo a resolverlo y como alternativa decidi crear el procedimiento bajo SYS.

==========================

Repito , es solo curiosidad.

Un saludo
  #9 (permalink)  
Antiguo 28/12/2007, 14:44
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Re: Listar Un Directorio

Hola,

Código:
SQL> grant select on X$KRBMSFT to oracle
  2  ;
grant select on X$KRBMSFT to oracle
                *
ERROR at line 1:
ORA-02030: can only select from fixed tables/views


SQL> ho oerr ora 02030
02030, 00000, "can only select from fixed tables/views"
// *Cause:  An attempt is being made to perform an operation other than
//         a retrieval from a fixed table/view.
// *Action:  You may only select rows from fixed tables/views.
Al parecer no se pueden realizar operaciones sobre estas tablas aparte de un select. Seguramente hay alguna forma de lograrlo, pero por ahora no lo voy a investigar porque estoy de vacaciones y posteando desde el portatil de un amigo :)

Saludos
  #10 (permalink)  
Antiguo 28/12/2007, 20:48
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Re: Listar Un Directorio

He encontrao un link interesantillo sobre eso .

http://awads.net/wp/2005/10/04/under...-a-difference/

De todas maneras ( y si me acuerdo ) cuando esté en el curro lo investigo, pero por lo que pone en esa pagina puede que lo que debas hacer es :

grant select on X_$KRBMSFT to oracle.

Ya lo miraré, es todo un reto..................
  #11 (permalink)  
Antiguo 31/12/2007, 04:32
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Re: Listar Un Directorio

Hola,

Hay mas informacion sobre la forma de trabajar de este package.

1. Es necesario que el parametro db_recovery_file_dest contenga un valor para que el package funcione.
2. El procedimiento SearchFiles no hace un raise de exepciones, por lo tanto si el directorio indicado no existe o no se tienen privilegios, entonces el cursor que devuelve es nulo.
3. El procedimiento SearchFiles busca en sub-directorios tambien, es decir devuelve la lista completa de archivos del directorio indicado mas todos los sub-directorios que se encuentren debajo.
4. La tabla X$KRBMSFT es una tabla in-memory, no tengo idea de lo que significa, aunque me lo imagino, por lo tanto a tener un poco de consideracion sobre la lista de ficheros a leer, dado que lo estaremos cargando directamente en memoria.
5. Al parecer para poder exponer esta tabla a otros usuarios que no sean SYS, hay que wrapearla dentro de una vista y dar grant de select sobre la vista, por ejemplo (esto no lo tengo probado).

Código:
create or reaplce view SYS.X_$KRBMSFT
as
select * from SYS.X$KRBMSFT;

grant select on SYS.X_$KRBMSFT to usuario;
6. El contenido de la tabla X$KRBMSFT es por sesion, lo que significa que si dos sesiones ejecutan el package para ver la lista de ficheros de directorios diferentes, no se van a molestar entre ellas.


Saludos
  #12 (permalink)  
Antiguo 07/02/2008, 05:47
 
Fecha de Ingreso: septiembre-2004
Mensajes: 191
Antigüedad: 20 años, 3 meses
Puntos: 1
Re: Listar Un Directorio

Gracias por la info matanga, de momento no vamos a meter esta feature en la aplicacion. Pero si intentamos ponerlo en marcha escribire si nos funciona y como lo hemos hecho
  #13 (permalink)  
Antiguo 07/02/2008, 06:20
 
Fecha de Ingreso: noviembre-2007
Ubicación: Argentina
Mensajes: 134
Antigüedad: 17 años, 1 mes
Puntos: 3
Re: Listar Un Directorio

Matanga, que buen post !!!!!

Copy / Paste y derechito a mi carpeta de Scripts.

Que disfrutes esas vacaciones.

Saludos desde lo mas austral del mundo, Mario.
  #14 (permalink)  
Antiguo 14/05/2009, 07:46
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 24 años, 2 meses
Puntos: 3
Respuesta: Listar Un Directorio

Gracias Matanga!,
Justo necesito hacer una tarea automática que me agarre todos los ficheros de un directorio y los cargue a una tabla y creo que esto me servirá. Hasta la parte al menos de leer los ficheros del directorio vamos bien.

Ahora, como los ficheros que necesito cargar son bastante pesados (1 giga cada uno), cómo será mejor hacer la importación?? ¿será capaz de hacerlo en tiempo razonable y sin errores la libreria "UTL_FILE"? ¿No hay forma de llamar dentro del procedimiento a un comando sqlldr y que éste haga la tarea?


Saludoss
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
  #15 (permalink)  
Antiguo 14/05/2009, 08:40
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 17 años, 6 meses
Puntos: 43
Respuesta: Listar Un Directorio

Si no estoy muy equivocado ,para llamadas al SO desde paquetes de BBDD, poderse se puede, pero tienes que utilizar librerias java.
  #16 (permalink)  
Antiguo 14/05/2009, 13:47
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años, 1 mes
Puntos: 85
Respuesta: Listar Un Directorio

Con UTL_FILE podrías lograrlo, pero tengo la impresión de que por el tamaño de los archivos vas a estar un buen rato esperando a que el proceso termine, con este paquete solo puedes recorrer los archivos línea por línea y por cada una, hacer un INSERT.

Una opción puede ser tablas externas, que están basadas en el motor de Data Pump o SQL*Loader, con esto, el proceso de carga va a ser mucho más rápido, la desventaja es que tienes que conocer de antemano cuales y cuantos son los ficheros, ya que la ruta y nombre de cada uno compone la sentencia SQL que crea la tabla externa, por ejemplo

Código:
archivo_de_datos.csv
001,Nombre,Apellido,Telefono,Edad

SQL> create or replace directory data_dir
  2  as 'path_al_directorio_de_ficheros';

Directory created.

SQL> create table t1
  2      ( id varchar2(3),
  3        nombre varchar2(50),
  4        apellido varchar2(50),
  5        telefono varchar2(9),
  6        edad number(10)
  7        
  8      )
  9      organization external
 10      ( default directory data_dir
 11        access parameters
 12        ( records delimited by newline
 13          fields terminated by ','
 14        )
 15        location ('archivo_de_datos.csv')  
 16    )
Por último, se me ocurre cargar cada archivo como un campo BFILE o BLOB, de esta manera te queda una sola tabla que contiene un archivo por registro, y a partir de ahí procesarlos según lo necesites, para esto revista el método LOADFROMFILE del package DBMS_LOB.

Saludos
  #17 (permalink)  
Antiguo 18/05/2009, 08:08
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 24 años, 2 meses
Puntos: 3
Respuesta: Listar Un Directorio

Muchas gracias!, Intentaré hacerlo con esta forma de llamar al archivo de texto como una tabla. Creo que podría crear y recrear esta tabla dentro del cursor que lee los ficheros en el directorio y que cada fichero lo vaya copiando a una tabla fija del Oracle (además puedo aprovechar de filtrar sólo los datos que me importan).

Saludos
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
  #18 (permalink)  
Antiguo 02/06/2009, 15:17
Avatar de Sir Matrix  
Fecha de Ingreso: octubre-2000
Ubicación: Dentro de mi cabeza. ono?
Mensajes: 1.264
Antigüedad: 24 años, 2 meses
Puntos: 3
Respuesta: Listar Un Directorio

Estimados, saben cómo hacer para borrar ficheros desde el oracle ahora?

Saludos
__________________
|||| ))>_<(( ||||
www.webmagic.cl <-- esta pagina está mala, no la busquen
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 08:12.