Oracle + cvs format | EXPORTACION DE TABLAS A CSV

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″

About Juan Andres
Consultant | Oracle DBA & IT Specialist | LinuxUnix Administrator | Father | Musician | Farmer | Environmentalist | Writer | Builder | Buenos Aires · burzaco.wordpress.com

2 Responses to Oracle + cvs format | EXPORTACION DE TABLAS A CSV

  1. Ivan Acosta says:

    Que Tal Juan andres….Excelente aporte…con este articulo, gracias por compartir tu conocimiento.

%d bloggers like this: