16/9/10

DBMS_RANDOM

Paquete para generar números aleatorios o cadenas aleatorias.

1. Métodos
Los procedimientos y funciones que incluye este paquete son:
1.1 INITIALIZE
Inicializa el valor de la semilla del generador de números aleatorios.
   EXEC dbms_random.initialize(12345678);

1.2 NORMAL
Devuelve números aleatorios siguiendo un distribución normal.
   SELECT dbms_random.normal
   FROM dual;
   -- Sólo valores positivos
   SELECT ABS(dbms_random.normal)
   FROM   dual;

1.3 RANDOM
Genera números aleatorios.
   SET SERVEROUTPUT ON
   DECLARE
    aleator PLS_INTEGER;
    semilla NUMBER(20);
   BEGIN
    SELECT hsecs
    INTO   semilla
    FROM   gv$timer;
    dbms_random.initialize(semilla);
    FOR i IN 1..10
    LOOP
      aleator := dbms_random.random;
      dbms_output.put_line(aleator);
      semilla := aleator;
    END LOOP;
    dbms_random.terminate;
   END;
   -- Genera números positivos entre 1 y 100
   SELECT (1+ABS(MOD(dbms_random.random,100)))
   FROM   dual;

1.4 SEED
Reinicializa el valor de la semilla
   EXEC dbms_random.seed(87654321);

1.5 STRING
Crea una cadena de caracteres aleatoria. La definición de la función es como sigue, dbms_random.string(opcion IN CHAR, longitud IN NUMBER), donde opción puede tomar los valores:

  • 'a' o 'A': Genera una cadena aleatoria con sólo letras íncluyendo mayúsculas y minúsculas. 
  • 'l' o 'L': Genera una cadena aleatoria con sólo letras minúsculas. 
  • 'p' o 'P': Genera una cadena aleatoria con cualquier tipo de carácter imprimible. 
  • 'u' o 'U': Genera una cadena aleatoria con sólo letras mayúsculas. 
  • 'x' o 'X': Genera una cadena aleatoria con caracteres alfa numéricos en mayúsculas.

   -- Genera una cadena de 10 caracteres formada
   -- por letras mayúsculas y minúsculas
   SELECT dbms_random.string('A', 10)
   FROM   dual;

1.6 TERMINATE
Indica que hemos terminado de usar el paquete DBMS_RANDOM.
   dbms_random.terminate;
1.7 VALUE
Sin parámetros devuelve un valor aleatorio entre 0 y 1 con un número fijo de decimales, pero también puede usarse con parametros para que devuelva números aleatorios entre un rango de numeros.
   SELECT dbms_random.value
   FROM   dual;
   -- Develve números aleatorios entre 10 y 20
   SELECT dbms_random.value(10, 20)
   FROM dual;
2. Ejemplo
A continuación podéis ver un ejemplo de programa PL/SQL que genera números aleatorios entre 0 y 1 y que no utiliza el paquete DBMS_RANDOM
   DECLARE
    semilla NUMBER;
   BEGIN
    semilla := EXP(TO_NUMBER(TO_CHAR(SYSDATE,'ss'))/59);
    FOR i IN 1..10
    LOOP
      semilla := 1/(semilla - TRUNC(semilla));
      semilla := semilla - TRUNC(semilla);
      dbms_output.put_line(semilla);
    END LOOP;
   END;

1 comentario:

  1. Muy interesante. Tengo una página en inglés sobre DBMS_RANDOM en mi propio blog. Hay un vínculo a esta página al fin para hispanohablantes.

    ResponderEliminar