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.
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 de denciso
1
Respuesta de albrico
1