Procedimiento de llenado de datos DUMMY

En esta ocasión, les incluyo aquí un procedimiento de Oracle bastante útil que me pasó un compañero, quien a su vez, la encontró en internet, sólo le hice un par de pequeños cambios para hacerlo más versátil. Este procedimiento, llena una tabla cualquiera con datos DUMMY de acuerdo a la longitud y el tipo de las columnas de la tabla.

Nota al 19/02/2011

Ya no hagan caso de este post, he integrado un script en  Scripts útiles para un DBA llamado dummy, con el cual, se realiza la misma tarea sin la necesidad de crear un objeto en la base de datos, nada más de usarlo, tendrán las tablas llenas con datos DUMMY.

En el siguiente link, podrán bajar el procedimiento que menciono. La pongo en Word porque ahí se ve mejor y si la ponía en archivo txt, no lo podía subir al WordPress. Así, en ese formato, podrán copiarlo y usarlo:

fill_table   <— OBSOLETO

El script lo compilo en un usuario común y crea el procedimiento de llenado. Un compañero del trabajo me reportó que le marcó error. Lo bajé de nuevo y lo corrí con dicho usuario mortal y no me marcó errores. Si les marca alguno, por favor dejen un comentario y lo revisamos.

SQL> conn prueba/prueba
Connected.

SQL>
SQL> create or replace procedure fill_table (p_tname in varchar2, p_records in number, p_clone in boolean)
  2  authid current_user as
  3  -------------------------------------------------------------------------------------------------------------------
---------------
  4  -- Nombre:         flll_table
  5  -- Modificó:               Orlando Olguín Olvera
  6  -- Descripción:    Llena la tabla p_tname en todos sus campos, con p_records registros de datos aleatorios. Si p_cl
one es
  7  --                 true, entonces se crea una copia de la tabla p_tname, y en ella se insertan los p_records regist
ros.
  8  -------------------------------------------------------------------------------------------------------------------
---------------
  9    l_insert long;
 10    l_rows   number default 0;
 11  begin
 12    -- Validar si se crea una tabla copia de la original.
 13    if p_clone = true then
 14      execute immediate 'create table clone_' || p_tname ||
 15                        ' as select * from ' || p_tname ||
 16                        ' where 1=0';
 17
 18      l_insert := 'insert into clone_' || p_tname || ' select ';
 19    else
 20      l_insert := 'insert into ' || p_tname || ' select ';
 21    end if;
 22
 23    -- Ciclo para llenar la tabla clonada o no con la información aleatoria.
 24    for x in (select data_type, data_length,
 25                     rpad ('9', nvl (data_precision, 10), '9') / power (10, nvl (data_scale, 1)) maxval
 26              from   user_tab_columns
 27              where  table_name = upper(p_tname)
 28              order by column_id) loop
 29
 30      if ( x.data_type in ('NUMBER', 'FLOAT' )) then
 31        l_insert := l_insert || 'dbms_random.value(1,' || x.maxval || '),';
 32      elsif ( x.data_type = 'DATE' ) then
 33       l_insert := l_insert || 'sysdate+dbms_random.value+dbms_random.value(1,1000),';
 34      else
 35        l_insert := l_insert || 'dbms_random.string(''A'',' || x.data_length || '),';
 36      end if;
 37    end loop;
 38
 39    l_insert := rtrim(l_insert,',') || ' from all_objects where rownum <= :n';
 40
 41    loop
 42      dbms_output.put_line (l_insert);
 43     dbms_output.put_line (to_char (p_records) || '-' || to_char (l_rows));
 44      execute immediate l_insert using p_records - l_rows;
 45      l_rows := l_rows + sql%rowcount;
 46      exit when ( l_rows >= p_records );
 47    end loop;
 48  end;
 49  /

Procedure created.

SQL>

¿Cómo se usa?

En el código que se ve a continuación, compilo el procedimiento y lo pruebo con una tabla llamada PRUEBA.

SQL> star f:\ewq\txt\help\fill_table
Procedure created.
SQL> desc prueba
 Name                            Null?    Type
 ------------------------------- -------- ----------------------------
 ENAME                                    VARCHAR2(10)
 JOB                                      VARCHAR2(9)
 SAL                                      NUMBER
 COMM                                     NUMBER
SQL> exec fill_table ('prueba', 15, false);
PL/SQL procedure successfully completed.
SQL> select *
  2  from   prueba;
ENAME      JOB              SAL       COMM
---------- --------- ---------- ----------
InKLfzyvBA JYyWyPhOz 31246173.4  749407678
zmqxnnajvC LZIHvNVTa  209785470  635604416
WSeRFtpbZC IcJGbxlPu 24502621.3  128128500
bJRULsRqsv VURQskmPM  552921439  840785825
XMRBGtKIWa BUyqeWiwl  701118711  957176543
tTYUtsrKOG RNXcPLeUO  854033655  857682223
MtMyozoVWN FwQrFJsQI  335270075  503911686
kyejJVylbo xdKrIYIOP   89912379  305184131
LXJShVfTwu zqWwCiwaa  551587804  366868398
AXxEozTZxg TojCgzPcS  864001608  708528274
SLtgtoizkh QcNQMJmGS  231271620  754749798
leBWWLfBpK soMhRlnnk 27542210.7  795880209
ZtjAspmRbQ DXmohFMue  870190906  845419761
ZuxtzDztnw sFXlXrJnn  914599552 85686565.9
MxhWStLQgf JwnTsnAmc  672440796  186960454
15 rows selected.

Después, vuelvo a correr el procedimiento, pero clonando esta vez la tabla:

SQL> exec fill_table ('prueba', 15, true);
PL/SQL procedure successfully completed.
SQL> select count(*)
  2  from   prueba;
  COUNT(*)
----------
        15
SQL> select *
  2  from   clone_prueba;
ENAME      JOB              SAL       COMM
---------- --------- ---------- ----------
hnpudyVtHy rqZvNrFPj  607093639 70220782.7
jjLyKmJTsx UitGbgrMB  191900190  147450979
XFEJeYIWgq MSVfxbExr  373432558  276522538
qsySGnZsPX HlItNkGgS 8905963.72  627109461
KTAfVLZXLa rCFpMsiWn  609518989  571881762
RzFfGmeuEe CmOWNJrey 1432716.01  694210752
RdwxAbkYmK jzmqZmJPP 69815787.7  496357985
xpNQPhqqiG FIaOzhPeY  781870259  571264188
EQsLBgcYvE wpxhsenrK  829095349  578543347
vlyzUGEKyt TUSJqusoc  889396406  748979631
YEmBFCrsHI TZbDkyQLe  423299747  854731730
PWGfsagHhe jvQwqAqMN  253161921  580093055
YUXFRaCYPg sQtEwNhMj  413744379  534617612
CZQQcuxMdp DqPVnghRp  249729144 1763928.11
yXnseeCkMo QnuoxRDdD  847982901  543598660
15 rows selected.

Si la información de este post te ha sido de utilidad o quieres que agregue algo más, deja por favor un comentario, contestaré a la brevedad.

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: