- Blogzote.com - http://www.blogzote.com -
Oracle UTL_FTP
Posted By Donzote On 15 marzo 2007 @ 18:32 In Oracle | 49 Comments
Hace unos me surgió la necesidad de realizar el paso de algunos archivos planos entre servidores, el problema es que este paso se va a realizar constantemente, entonces tuve que pensar en una solución que fuera fácil, aparte esos archivos no son mas que información que se procesa e ingresa a una tabla de base de datos.
De entrada la solución que se proponía era realizar un shell script para realizar el paso de archivos vía ftp de un servidor a otro, soluciona el problema pero no estaba muy de acuerdo, primero tener que llamar a un shell para después conectarte a Oracle y llamar a un procedimiento, le quita el control a Oracle sobre el manejo de esos archivos, otra era usar directamente UTL_FILE, pero este paquete sirve para el manejo de archivos en el mismo servidor de base de datos, que yo sepa, con utl_file no se puede manejar archivos de otras maquinas.
Tiempo atrás ya había leído de la existencia de un paquete para el manejo de conexiones tcp, el paquete se llama UTL_TCP, suponía entonces que ya debería de existir algo relacionado con el manejo de archivos entre servidores, la opción lógica era buscar el paquete UTL_FTP pero sorpresa, este no existe, bueno y ¿que dice Google al respecto? le di buscar utl_ftp [1] y me regreso varias paginas, me encontré primero con un script guardado en sourceforce [2] llamado “plsqlftp [3]“, pero no me convenció, su desarrollo se ve casi abandonado y no encontré un solo ejemplo de cómo se usa, acabe descartándolo.
Rascándole un poquito mas a los resultados me tope con el que finalmente implemente, le llamaron “FTP Interfase [4]“, me quedo perfecto para lo que necesitaba, se ve bastante robusto y completo, yo solo use tres funciones, “VERIFY_SERVER”, “PUT” y “GET” pero tiene muchas mas, igual más adelante las pueda necesitar, aquí les dejo el procedimiento que generé para realizar los movimientos de archivos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | -- -- MOVE_FILE -- -- move file "p_filename" with ftp interfase, use put or get "p_type_move -- "p_type_move" = "PUT" => from "p_localpath" to "p_remotepath" -- "p_type_move" = "GET" => from "p_remotepath" to "p_localpath" -- use ftp server "p_hostname" with usr "p_username" and pwd "p_password" -- PROCEDURE move_file ( p_type_move IN VARCHAR2, p_localpath IN VARCHAR2, p_remotepath IN VARCHAR2, p_filename IN VARCHAR2, p_username IN VARCHAR2, p_password IN VARCHAR2, p_hostname IN VARCHAR2, p_error OUT VARCHAR2) IS v_exception EXCEPTION; p_status VARCHAR2(32000); p_bytes_trans NUMBER; p_trans_start DATE; p_trans_end DATE; dummy BOOLEAN; BEGIN IF (p_type_move != 'PUT') AND (p_type_move != 'GET') THEN p_error := 'ERROR: value for p_type_move not supported.'; RAISE v_exception; END IF; dummy := ftp_interface.verify_server ( p_remotepath => p_remotepath, p_username => p_username, p_password => p_password, p_hostname => p_hostname, v_status => p_status, v_error_message => p_error, p_port => 21, p_filetype => 'ASCII', p_mainframe_connection => FALSE ); IF p_status != 'SUCCESS' THEN RAISE v_exception; END IF; IF p_type_move = 'PUT' THEN dummy := ftp_interface.put ( p_localpath => p_localpath, p_filename => p_filename, p_remotepath => p_remotepath, p_username => p_username, p_password => p_password, p_hostname => p_hostname, v_status => p_status, v_error_message => p_error, n_bytes_transmitted => p_bytes_trans, d_trans_start => p_trans_start, d_trans_end => p_trans_end, p_port => 21, p_filetype => 'ASCII', p_mainframe_ftp => FALSE, p_mainframe_cmd => '' ); IF p_status != 'SUCCESS' THEN RAISE v_exception; END IF; ELSIF p_type_move = 'GET' THEN dummy := ftp_interface.get ( p_localpath => p_localpath, p_filename => p_filename, p_remotepath => p_remotepath, p_username => p_username, p_password => p_password, p_hostname => p_hostname, v_status => p_status, v_error_message => p_error, n_bytes_transmitted => p_bytes_trans, d_trans_start => p_trans_start, d_trans_end => p_trans_end, p_port => 21, p_filetype => 'ASCII', p_mainframe_ftp => FALSE, p_mainframe_cmd => '' ); IF p_status != 'SUCCESS' THEN RAISE v_exception; END IF; END IF; p_error := 'OK'; EXCEPTION WHEN v_exception THEN NULL; WHEN OTHERS THEN p_error := 'ERROR: ' || SQLERRM; END move_file; |
La llamada al procedimiento se realiza de manera muy fácil:
1 2 3 4 5 6 7 8 | move_file('GET', '/datos', '/home', 'test.txt', 'usuario', 'password', 'ip_del_host', v_error); |
Article printed from Blogzote.com: http://www.blogzote.com
URL to article: http://www.blogzote.com/2007/03/15/oracle-utl_ftp/
URLs in this post:
[1] buscar utl_ftp: http://www.google.com.mx/search?hl=es&q=utl_ftp&btnG=Buscar+con+Google&meta=
[2] sourceforce: http://sourceforge.net/
[3] plsqlftp: http://sourceforge.net/projects/plsqlftp/
[4] FTP Interfase: http://www.myoracleportal.com/index.php
Click here to print.