En la semana pasada me pidieron exportar varias tablas a formato CVS.
Aqui les dejo como lo resolvi, ya que es una tarea poco común y se nos va facilmente de la cabeza en el día a día.
El ejemplo se los dejo sobre una tabla que me tome la molestia de crearla especialmente para esta nota.
Nombre de la tabla.
DiccionarioDeCalles.
Procedimiento para la exportación de una tabla a formato cvs.
En primer lugar cree un procedure que se encargara de todo =D !
SQL> CREATE OR REPLACE PROCEDURE export_cvs ( p_sql IN VARCHAR2 ,p_dir IN VARCHAR2 ,p_header_file IN VARCHAR2 ,p_data_file IN VARCHAR2 := NULL) IS v_finaltxt VARCHAR2(4000); v_v_val VARCHAR2(4000); v_n_val NUMBER; v_d_val DATE; v_ret NUMBER; c NUMBER; d 2 NUMBER; col_cnt INTEGER; f BOOLEAN; rec_tab DBMS_SQL.DESC_TAB; col_num 3 NUMBER; v_fh UTL_FILE.FILE_TYPE; v_samefile BOOLEAN := (NVL(p_data_file,p_header_fil 4 e) = p_header_file); BEGIN c := DBMS_SQL.OPEN_CURSOR; DBMS_SQL.PARSE(c, p_sql, DBMS_SQL.NATIVE); 5 6 7 d := DBMS_SQL.EXECUTE(c); DBMS_SQL.DESCRIBE_COLUMNS(c, col_cnt, rec_tab); FOR j in 1..col_cnt 8 9 LOOP CASE rec_tab(j).col_type WHEN 1 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_v_val,2000); 10 WHEN 2 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_n_val); WHEN 12 THEN DBMS_SQL.DEFINE_COLUMN(c,j,v_ 11 d_val); ELSE DBMS_SQL.DEFINE_COLUMN(c,j,v_v_val,2000); END CASE; END LOOP; ---- ---- ******************************************************************** ---- v_fh := UTL_FILE.FOPEN(upper(p_dir),p_header_file,'w',32767); FOR j in 14 15 16 1..col_cnt LOOP v_finaltxt := ltrim(v_finaltxt||','||lower(rec_tab(j).col_name),','); END LO 17 OP; ---- ******************************************************************* ---- ---- UTL_FILE.PUT_LINE(v_fh, v_finaltxt); IF NOT v_samefi 18 le THEN UTL_FILE.FCLOSE(v_fh); END IF; ---- ---- ******************************************************************** ---- ---- Aqui tenemos la salida de los datos ---- ---- ******************************************************************** IF NOT v_samefil 19 e THEN v_fh := UTL_FILE.FOPEN(upper(p_dir),p_data_file,'w',32767); END IF; LOOP v_ret := 20 21 DBMS_SQL.FETCH_ROWS(c); EXIT WHEN v_ret = 0; v_finaltxt := NULL; FOR j in 1..col_cnt 22 LOOP CASE rec_tab(j).col_type WHEN 1 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_v_val); 23 v_finaltxt := ltrim(v_finaltxt||',"'||v_v_val||'"',','); WHEN 2 THEN DBMS_SQL. 24 COLUMN_VALUE(c,j,v_n_val); v_finaltxt := ltrim(v_finaltxt||','||v_n_val,','); 25 26 WHEN 12 THEN DBMS_SQL.COLUMN_VALUE(c,j,v_d_val); v_finaltxt := ltrim(v_fin 27 altxt||','||to_char(v_d_val,'DD/MM/YYYY HH24:MI:SS'),','); ELSE v_finaltxt := ltrim(v_ 28 finaltxt||',"'||v_v_val||'"',','); END CASE; END LOOP; -- DBMS_OUTPUT.PUT_LINE(v_finaltxt); UTL_FILE.PUT_LINE(v_fh, v_finaltxt); END LOOP; UTL_FILE.FCLOSE(v_fh); DBMS_SQL.CLOSE_ 29 CURSOR(c); END; / 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 Procedure created. SQL>
La ejecucion del procedure usa la siguiente nomenclatura:
exec export_cvs('sentencia SQL','Directorio de Exports','Archivo con extención .csv');
Ejecutamos el procedure.
SQL> exec export_cvs('select * from DiccionarioDeCalles','DUMPDIR_DAR','DiccionarioDeCalles.csv'); PL/SQL procedure successfully completed.
Vemos los resultados en el archivo que se almaceno el path de exports declarado en nuestra base de datos.
$ tail -f DiccionarioDeCalles.csv “CALLE”,”204927″,”137504″,”2799″,”205″,”27″,”129170″,”482837″,”5″,”196758″,”204916″,”204919″,”C400″,”0″,”1″,”400″,”4105″,”T”,”1″,”0″ “SALTA”,”204928″,”559″,”22″,”2″,”1″,”552″,”482838″,”3″,”196758″,”204916″,”204919″,”C430″,”0″,”1201″,”1800″,”4105″,”A”,”1″,”0″ “BAT”,”204928″,”117″,”18″,”3″,”3″,”117″,”482839″,”3″,”196758″,”204916″,”204919″,”B300″,”0″,”1201″,”1800″,”4105″,”P”,”1″,”0″ “DE”,”204928″,”15577″,”498″,”13″,”5″,”15195″,”482840″,”3″,”196758″,”204916″,”204919″,”D000″,”0″,”1201″,”1800″,”4105″,”P”,”1″,”0″ “CALLE”,”204928″,”137504″,”2799″,”205″,”27″,”129170″,”482841″,”3″,”196758″,”204916″,”204919″,”C400″,”0″,”1201″,”1800″,”4105″,”T”,”1″,”0″ “SAN”,”204929″,”4796″,”131″,”9″,”1″,”4666″,”482842″,”2″,”196758″,”204916″,”204919″,”C500″,”0″,”1″,”200″,”4105″,”A”,”2″,”0″ “MARTIN”,”204929″,”3234″,”92″,”5″,”1″,”3171″,”482843″,”2″,”196758″,”204916″,”204919″,”M635″,”0″,”1″,”200″,”4105″,”A”,”2″,”0″ “CALLE”,”204929″,”137504″,”2799″,”205″,”27″,”129170″,”482844″,”2″,”196758″,”204916″,”204919″,”C400″,”0″,”1″,”200″,”4105″,”T”,”2″,”0″ “SUIPACHA”,”204930″,”193″,”3″,”1″,”1″,”190″,”482845″,”3″,”196758″,”204916″,”204919″,”C120″,”0″,”1401″,”1800″,”4105″,”A”,”1″,”0″ “BAT”,”204930″,”117″,”18″,”3″,”3″,”117″,”482846″,”3″,”196758″,”204916″,”204919″,”B300″,”0″,”1401″,”1800″,”4105″,”P”,”1″,”0″
Que Tal Juan andres….Excelente aporte…con este articulo, gracias por compartir tu conocimiento.
Me gustaMe gusta
Gracias a vos Ivan por el reconocimiento.
Me gustaMe gusta