Generación dinámica de Archivos Planos

Tengo un aplicstivo que se compone + o - de 19 tablas de las cuales debe generar archivos planos por cada tabla para remitirlos a otra entidad, la verdad no quiero hacerlo uno por uno sino un modulo dinámico que los genere, para lo cual se creo una tabla que contiene el nombre y orden de todas la tablas que se quieren enviar y luego mediante cursores quiero generar el contenido sin importar las columnas de las tablas, para lo cual se realizo el siguiente modulo.
Declare
v_columnas varchar2(2000);
v_columna_cursor varchar2(2000);
v_ejecuta_cursor varchar2(2000);
v_tabla varchar2(100);
v_cont number:=0;
v_tot number:=0;
datos text_io.file_type;
v_cadena varchar2(200);
v_cursor varchar2(2000);
cursor tablas is
select rowid,tabla,campos,nombre_archivo from uis_tablas
order by secuencia;
cursor columna is
select column_name from all_tab_columns
where owner='cae'
and table_name=v_tabla;
begin
--abre cursor de tablas
message('iniciando ');
message('iniciando ');
for a in tablas
loop
v_tabla := a.tabla;
v_cont := 1;
v_columnas := null;
v_columna_cursor := null;
select nvl(count(*),0) into v_tot from all_tab_columns
where owner='cae'
and table_name=v_tabla;
--abre cursor de columnas por cada tabla del cursor anterior
for b in columna
loop
v_columnas :=v_columnas||b.column_name;
v_columna_cursor := v_columna_cursor||'c.'||b.column_name;
if v_cont < v_tot then
v_columnas :=v_columnas||',';
v_columna_cursor := v_columna_cursor||',';
end if;
v_cont := v_cont+1;
end loop;
update uis_tablas
set campos=v_columnas,columna_cursor=v_columna_cursor
where rowid=a.rowid;
end loop;
--abre el cursor de tablas con la defincion de columnas
message('iniciando 1');
message('iniciando 1');
for c in tablas
loop
v_tabla := c.tabla;
--crea cursor con los campos de cada tabla
v_cursor := 'cursor datos is select '||c.campos||' from '||c.tabla;
message('iniciando v-cursor');
message('iniciando v_cursor');
forms_ddl(v_cursor);
datos:=text_io.fopen(:ruta_archivos||c.nombre_archivo,'w');
message('iniciando ejecuta_cursor');
message('iniciando ejecuta_cursor');
v_ejecuta_cursor := 'for d in datos
loop
begin
v_cadena:=c.columna_cursor;
text_io.put_line(datos,v_cadena);
end;
end loop;';
forms_ddl(v_ejecuta_cursor); end loop;
end;
El modulo me genera los archivos pero los deja en blanco, no se si sea por utilizar el forms_ddl o que.

2 Respuestas

Respuesta
1
Esto sucede porque no es una forma exacta de ejecutar la extracción, ya que no es un interprete de macros como lo hacia clipper en su momento, tendrás que generar una variable con todos los datos en un string de selección y después realizas un execute de esa variable...
Que pen ala verdad me dejaste igual por favor ilústrame como debería hacerlo
Sugiero revisar la documentación de la instrucción execute de sql server para que de ahí partas en la construcción de la sentencia final que vas a utilizar para extraer los datos...
Respuesta
1
Yo tengo mi propia forma de matar las pulgas. Este programa me lo envío Tom Kyte de Oracle y me ha resultado muy práctico:
Solo debes tecordar que el nombre del directorio debe estar ubicado en el servidor de base de datos. También es necesario que el parámetro de
INIT.ORA (utl_file_dir) debe estar seteado !!!
create or replace function dump_csv( p_query in varchar2,
p_separator in varchar2
default ',',
p_dir in varchar2 ,
p_filename in varchar2 )
return number
AUTHID CURRENT_USER
is
l_output utl_file.file_type;
l_theCursor integer default dbms_sql.open_cursor;
l_columnValue varchar2(2000);
l_status integer;
l_colCnt number default 0;
l_separator varchar2(10) default '';
l_cnt number default 0;
begin
l_output := utl_file.fopen( p_dir, p_filename, 'w' );
dbms_sql.parse( l_theCursor, p_query, dbms_sql.native );
for i in 1 .. 255 loop
begin
dbms_sql.define_column( l_theCursor, i,
l_columnValue, 2000 );
l_colCnt := i;
exception
when others then
if ( sqlcode = -1007 ) then exit;
else
raise;
end if;
end;
end loop;
dbms_sql.define_column( l_theCursor, 1, l_columnValue,
2000 );
l_status := dbms_sql.execute(l_theCursor);
loop
exit when ( dbms_sql.fetch_rows(l_theCursor) <= 0 );
l_separator := '';
for i in 1 .. l_colCnt loop
dbms_sql.column_value( l_theCursor, i,
l_columnValue );
utl_file.put( l_output, l_separator ||
l_columnValue );
l_separator := p_separator;
end loop;
utl_file.new_line( l_output );
l_cnt := l_cnt+1;
end loop;
dbms_sql.close_cursor(l_theCursor);
utl_file.fclose( l_output );
return l_cnt;
end dump_csv;
/
Para probar o hacer test del programa lo puedes hacer de la siguiente manera:
create or replace procedure test_dump_csv
as
l_rows number;
begin
l_rows := dump_csv( 'select *
from all_users
where rownum < 25',
',', '/tmp', 'test.dat' );
end;
/
ARA

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas