You are on page 1of 1

create or replace procedure fill_table (p_tname in varchar2, p_records in number, p_clone in boolean)

authid current_user as
----------------------------------------------------------------------------------------------------------------------------------
-- Nombre: flll_table
-- Modificó: Orlando Olguín Olvera
-- Descripción: Llena la tabla p_tname en todos sus campos, con p_records registros de datos aleatorios. Si p_clone es
-- true, entonces se crea una copia de la tabla p_tname, y en ella se insertan los p_records registros.
----------------------------------------------------------------------------------------------------------------------------------
l_insert long;
l_rows number default 0;
begin
-- Validar si se crea una tabla copia de la original.
if p_clone = true then
execute immediate 'create table clone_' || p_tname ||
' as select * from ' || p_tname ||
' where 1=0';

l_insert := 'insert into clone_' || p_tname || ' select ';


else
l_insert := 'insert into ' || p_tname || ' select ';
end if;

-- Ciclo para llenar la tabla clonada o no con la información aleatoria.


for x in (select data_type, data_length,
rpad ('9', nvl (data_precision, 10), '9') / power (10, nvl (data_scale, 1)) maxval
from user_tab_columns
where table_name = upper(p_tname)
order by column_id) loop

if ( x.data_type in ('NUMBER', 'FLOAT' )) then


l_insert := l_insert || 'dbms_random.value(1,' || x.maxval || '),';
elsif ( x.data_type = 'DATE' ) then
l_insert := l_insert || 'sysdate+dbms_random.value+dbms_random.value(1,1000),';
else
l_insert := l_insert || 'dbms_random.string(''A'',' || x.data_length || '),';
end if;
end loop;

l_insert := rtrim(l_insert,',') || ' from all_objects where rownum <= :n';

loop
dbms_output.put_line (l_insert);
dbms_output.put_line (to_char (p_records) || '-' || to_char (l_rows));
execute immediate l_insert using p_records - l_rows;
l_rows := l_rows + sql%rowcount;
exit when ( l_rows >= p_records );
end loop;
end;
/

You might also like