Autor Tema: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle  (Leído 4771 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado angellarasv

  • Trade Count: (0)
  • The newbie
  • *
  • Thank You
  • -Given: 0
  • -Receive: 0
  • Mensajes: 3
Señores.  Tengo una base Oracle 10g  y estoy implementando unos procedimientos almacenados que leen una cantidad de archivos planos TXT de una ubicación especifica del discos duros (Windows), y después de leer el contenido de los archivos estos son movidos a otra ubicación....Hasta aquí no tengo dificultad, pero ahora quiero crear en el disco duro unas carpetas o directorios para ir dejando los archivos procesados en una estructura ordenada,  pero no encuento ninguna forma de como hacerlo......Si alguien sabe como, se lo agradeceré eternamente.

la forma de hacerlo que he investigado solo son ejecutables o compatibles con el Form,
por ejemplo el  HOST("mkdir c:\archivos\nuevodirectorio"), pero no se pueden poner en un procedimiento almacenado.

Desconectado alberto.arevalo

  • -^- Elite Silver -^-
  • Trade Count: (2)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 20
  • Mensajes: 2469
  • Oracle Dba Senior
Re: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle
« Respuesta #1 : Febrero 10, 2011, 03:01:10 pm »
Hola amigo angel.

Perdon por no haber llegado antes a leer tu tema... fijate que primeramente nos das pocos insumos como para darte alguna idea de solucion.  por lo que logro entenderte  tu problema radica en como crear directorios LOGICOS en tu DB y como crearlos de forma dinamica tambien fisicamente en tu servidor....

yo empesaria  preguntandote... ¿realmente es necesario que se creen de forma dinamica?  si  pues tendriamos que pasar a la siguiente pregunta.

¿Trabajas con external procedures?  de tal forma que podras invocar un batch  o algun ejecutable que cree dicho directorio fisicamente en el server y la parte logica de presentarlo de la DB si es algo pan comido que lo podes hacer con un procedure

sin embargo.. me queda la duda.. de porque lo necesitas asi... esos directorios iran por fecha? o por cada archivo?... como?..

si das mas informacion podriamos ver que ondas.. yo ya he tenido alguna necesidad asi.. pero no tengo como para crearlos masivamente.. si preguntas en algun foro de ORACLE.. no re recomendaran hacer eso...

porque no nos das mas insumos?


saludos cordiales

PD:  En cuento a crear el directorio logico.. yo lo que haria es meter esta linea de codigo en un procedimiento

CREATE OR REPLACE DIRECTORY
BDUMP AS
'RUTA_DE_MI_DIRECTORIO_FISICO';

donde :RUTA_DE_MI_DIRECTORIO_FISICO sea una variable que contenga la ruta fisica

y toda la instruccion meterla en otra variable y mandarla a ejecutar con un EXECUTE IMMEDIATE

cada vez que lo necesites...

eso si.... toma en cuenta que la creacion de directorios no los puede hacer cualqueir mortal... es decir.. tendrias que darle los permisos pertinentes al usuario que crearia dicha accion o que ejecutaria dicho procedimiento



 
 




« Última Modificación: Febrero 10, 2011, 03:10:49 pm por alberto.arevalo »

Conectado Camus de Acuario

  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 326
  • -Receive: 1807
  • Mensajes: 7883
  • Ōrora Ekusukyūshon!
Re: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle
« Respuesta #2 : Febrero 10, 2011, 03:33:06 pm »
Lo que te puso alberto.arevalo es cierto, la forma que te pone el es para crear directorios logicos, a partir de un directorio fisico ya creado!, su create directory es un ddl  (data definition languaje) y no puede ser ejecutado directamente desde codigo plsql (igual que cualquier create, drop, truncate, etc), y por eso debes de ejecutarlo dinamicamente mediante un EXECUTE INMEDIATE.

Si quieres crear directorios fisicos, la manera mas facil que encuentro de hacero es asi:
si decis que tu server esta en windows
Código: [Seleccionar]
declare

my_Directory VARCHAR2(100);
begin

    my_Directory := 'c:/temp/folder1';
 
    DBMS_SCHEDULER.CREATE_JOB(job_name   => 'Crear: '||my_Directory,
                              job_type   => 'executable',
                              job_action => 'c:\windows\system32\cmd.exe /c mkdir ' || my_Directory,
                              enabled    => true,
                              auto_drop  => true);
    commit;
  end loop;
end;
/
tu usuario de esquema debe tener bastantes permisos para hacer esto........

Y como te dice alberto, no recomiendo la creacion y manejo de carpetas desde plsql, puedes crear los archivos que quieras siguiendo un orden y luego mediante un job, ejecutar algun archivo batch (windows) o shell (linux) para crear directorios y mover archivos, te complicaras menos y no tendras que hacer la maldita para que los DBA se rompan la cabeza dandote permisos a tu usuario.

Desconectado angellarasv

  • Trade Count: (0)
  • The newbie
  • *
  • Thank You
  • -Given: 0
  • -Receive: 0
  • Mensajes: 3
Re: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle
« Respuesta #3 : Febrero 10, 2011, 03:34:28 pm »
Gracias Alberto.  A continuación mas en Detalle.

Tal como tu lo mencionas en una de tus preguntas, lo que necesito es crear directorios  físicos en el disco duro del server a partir de la  fecha que internamente tiene cada archivo y de otro código, y se deben de crear dinamicamente, es decir en tiempo de ejecución.

Estoy utilizando un procedimiento interno de la base de datos, ya que requiero que se autoejecute de manera programada cada cierto periodo de tiempo.

Estos archivos son planos, TXT, y el procedimiento de abrirlos, leer el contenido, subir los datos a las tablas respectivas y mover el archivo, ya lo tengo listo.

Pero cada archivo es de una sucursal especifica y de una fecha especifica, y lo que quiero hacer es crear una estructura por sucursal y por Fecha, donde "sucursal" sea la carpeta mas externa y "fecha" la carpeta mas interna.  ejemplo

   Sucursal  ------>>>     01         ("01" es el nombre de la primer carpeta)
              FechaX1------>>       01012011
              FechaX2------>>       02012011
              FechaX3------>>       03012011
              FechaX4------>>       04012011

   Sucursal  ------>>>     02
              FechaX1------>>       01012011
              FechaX2------>>       02012011
              FechaX3------>>       03012011
              FechaX4------>>       04012011

   Sucursal  ------>>>     Xn........

Entonces la condicionante sería, que si la Carpeta para la sucursal No. "01", no existe que la cree, sino que pase a validar lo siguiente
si la carpeta mas interna correspondiente a la fecha no existe que la cree sino que solo copie el archivo en la carpeta respectiva.

como ves, la acción o las condicionantes para crear o no una carpeta no es lo importante, sino mas bien encontrar la forma de como crear las carpetas o directorios físicos en el disco duro desde un procedimiento almacenado en la base de datos.

Gracias por la ayuda.


Desconectado AleEe

  • Trade Count: (0)
  • Sv Full Member
  • *
  • Thank You
  • -Given: 43
  • -Receive: 114
  • Mensajes: 701
  • vndo asus p5g41c-m ddr2&ddr3, core2duo, RAMPatriot
    • http://www.svcommunity.org/forum/ventas/vendo-asus-p5g41c-m-*-ati-radeon-4870-*-4-gb-ddr2-800-mhz-patriot-*-core-2-duo/
Re: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle
« Respuesta #4 : Febrero 10, 2011, 03:43:17 pm »
no viene al caso pero tengo oracle 10g express edition y a veces me da error de sistema 5 alguien sabe porq?

Conectado Camus de Acuario

  • Trade Count: (10)
  • The Communiter-
  • *
  • Thank You
  • -Given: 326
  • -Receive: 1807
  • Mensajes: 7883
  • Ōrora Ekusukyūshon!
Re: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle
« Respuesta #5 : Febrero 10, 2011, 03:50:17 pm »
Para lo que acabas de decir, te sugiero que tengas una tabla con todas las sucursales mapeadas con su respectivo directorio (01, 02, 03, etc).

creas un cursor trayendo todas las sucursales y sus directorio, dentro del loop a la hora de abrir tu archivo (supongo que es mediante UTL_FILE) podes poner una excepcion del tipo: utl_file.invalid_operation (que curiosamente es la que me tira cuando el directorio no existe, en lugar de utl_file.invalid_path, extraño, pero bueno)

si te tira esa excepcion pones el codigo que te puse para crear el directorio y luego volver a tratar de abrir el archivo. por lo tanto no pongas ningun RETURN en esa excepcion.

Desconectado alberto.arevalo

  • -^- Elite Silver -^-
  • Trade Count: (2)
  • The Communiter-
  • *
  • Thank You
  • -Given: 11
  • -Receive: 20
  • Mensajes: 2469
  • Oracle Dba Senior
Re: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle
« Respuesta #6 : Febrero 10, 2011, 03:51:32 pm »
PARA ALE:
Cuando de errores de oracle hablamos.. tenes que poner el codigo de dicho error que generalmente empiezan con ORA-XXXX donde x es el numero del errror...  si das ese dato podriamos averiguar alguna posible solucion.

ok.. Siguiendo con el tema origiamal... viejito ... ya la hiciste.. con lo que te puso camus.. ya solo estas para echar el arte.. y como necesitas saber si un directorio existe o no para tomar accion y crearlo... echale un vistaso a esta vista:

SELECT * FROM ALL_DIRECTORIES

alli solo esta que mediante tu codigo.. barras las rutas o los nombres segun te convenga.. para determinar si ya existe un directorio o no.. y proba utilizar el codigo que te puso camus para crear dicho directorio.

aunque te dire.. que lo veo innecesario.. yo tambien trabajo con N cantidad de archivos planos.. que los utilizo para para cargar informacion o para trabajarlos como Logs y los tengo en una sola ubicacion.. solo que los identifico por el nombre del archivo..fecha y hora en que han sido generados  y me es bien facil trabajarlos no tengo ningun desorden.. pero para gustos los colores... creo que con lo que te hemos puesto.. para la proxima la primera version de tu procedimiento.. el cual seria bueno lo pusieras aca para efectos didacticos.

saludos




Desconectado angellarasv

  • Trade Count: (0)
  • The newbie
  • *
  • Thank You
  • -Given: 0
  • -Receive: 0
  • Mensajes: 3
Re: Como Crear directorios en disco desde un procedimiento Almacenado de Oracle
« Respuesta #7 : Febrero 10, 2011, 04:10:05 pm »
Excelente ....

Gracias Alberto y Camus, son una maravilla........ en este momento me dispongo a realizar las modificaciones y les cuento...

P.D.: la necesidad de crear directorios por sucursal  por fecha, es porque estos archivos son generados de cajas registradoras de las sucursales y los nombres de los archivos están basados en una cadena fija como base del nombre mas un correlativo, y el detalle es que los correlativos pueden ser los mismos o repetirse para diferentes sucursales y para diferente fechas, por lo tanto cuando los muevo a un directorio común, un archivo puede caerle encima a otro que no son de la misma sucursal, por eso la necesidad de guardarlos en esa estructura.

Saludos