PL/SQL MÁGICO

Generación de Datos Aleatorios en Oracle


Objetivos

  • Conocer el paquete DBMS_RANDOM.
  • Describir sus Funciones y Procedimientos.
  • Presentar ejemplos prácticos y funcionales.

Paquete DBMS_RANDOM

Dependiendo del requerimiento se pueden presentar escenarios en los cuales sea necesario generar valores aleatorios, ya sea para crear una gran cantidad de datos para propósitos de prueba de desempeño, o cuando simplemente necesitamos asignar un número X a un proceso.

Cualquiera que sea la necesidad, Oracle provee el Paquete DBMS_RANDOM que permite generar valores  numéricos, tipo carácter y cadenas alfanuméricas de forma aleatoria. Tenga presente que es posible especificar el tamaño y el rango a ser usado en la generación de los valores aleatorios.

Nota: En este paquete podemos ver como la sobrecarga de procedimientos y funciones es posible dentro de Bloques de PL/SQL tales como: Bloques anónimos, Subprogramas y Paquetes. Es decir, puede utilizar el mismo nombre para varios subprogramas diferentes, siempre y cuando sus parámetros difieran en número, orden o tipos de dato.

Lista de Procedimientos/Funciones Disponibles:

Sub ProgramaDescripción
Procedimiento INITIALIZEInicializa el paquete con un valor de semilla (SEED value).
Función NORMALRetorna números aleatorios en una distribución normal.
Procedimiento RANDOMGenera números aleatorios.
Procedimientos SEEDRestablece la semilla. Dicho procedimiento contiene una versión que recibe un parámetro BINARY_INTEGER(numérico) y una sobrecarga que recibe un tipo VARCHAR2(carácter).
Función STRINGGenera una cadena aleatoria.
Procedimiento TERMINATEFinaliza el paquete.
Funciones VALUEEsta función(sin parámetros) genera una numero aleatorio mayor o igual a 0 pero menor que 1. Su sobrecarga(con dos parámetros) genera un número aleatorio mayor o igual que el limite inferior(parámetro low) y menor que el limite superior(parámetro high). Ambas versiones tienen una precisión de 38 dígitos a la derecha del decimal.

Procedimiento INITIALIZE

Este procedimiento inicializa el generador. En síntesis este procedimiento es obsoleto ya que su función es simplemente llamar a los Procedimientos de SEED.

Función NORMAL

Esta función retorna números aleatorios en una distribución normal estándar.

Procedimiento RANDOM

Este procedimiento genera números aleatorios. Al igual que INITIALIZE, es considerado obsoleto y, aunque viene incluido en el paquete, no se recomienda su uso.

Procedimientos SEED

Estos procedimientos restablecen la semilla usada para generar números/cadenas aleatorias.

FunciónSTRING

Esta función genera una cadena aleatoria. La misma recibe dos parámetros descritos a continuación:

ParámetroDescripción
optEs usado para especificar el aspecto de la cadena de retorno: ‘u’, ‘U’ – Retorna una cadena de caracteres alfabéticos en mayúsculas. ‘l’, ‘L’ – Retorna una cadena de caracteres alfabéticos en minúsculas. ‘a’, ‘A’ – Retorna una cadena de caracteres alfabéticos mixta (mayúsculas y minúsculas). ‘x’, ‘X’ – Retorna una cadena de caracteres alfanuméricos en mayúsculas. ‘p’, ‘P’ – Retorna una cadena de cualquier carácter imprimible.Si no se especifica uno de los valores anteriores, se retorna una cadena de caracteres alfabéticos en mayúsculas.
lenLongitud de la cadena retornada.

Procedimiento TERMINATE

Se supone que una vez se haya terminado con el paquete, se debería llamar al procedimiento TERMINATE, pero realmente este no realiza función alguna y, aunque viene incluido en el paquete, es obsoleto y no debe utilizarse.

Funciones VALUE

Como ya especificamos, la función básica(sin parámetros) genera un número aleatorio, mayor o igual a 0 y menor que 1. La sobrecarga recibe dos parámetros (low y high) y retorna un numero mayor o igual que el primero (low) y menor que el segundo (high).


Ejemplos:

A continuación vemos algunos ejemplos de las funciones NORMAL, RANDOM, STRING y VALUE.

SELECT
        DBMS_RANDOM.NORMAL,
        DBMS_RANDOM.RANDOM,
        DBMS_RANDOM.string('U', 8),
        DBMS_RANDOM.string('L', 8),
        DBMS_RANDOM.string('K', 8),
        DBMS_RANDOM.VALUE,
        DBMS_RANDOM.VALUE(20,60)
FROM dual;

Ahora creamos la tabla calificaciones para lograr unos ejemplos más practicos.

CREATE TABLE hr.calificaciones
(   cod_estudiante      NUMBER(6),
    cod_semestre        NUMBER(1)
                    CONSTRAINT ck_sem CHECK(cod_semestre IN (1,2)),
    espanol             NUMBER(3),
    matematicas         NUMBER(3),
    sociales            NUMBER(3),
    naturales           NUMBER(3),

    CONSTRAINT pk_calif PRIMARY KEY (cod_estudiante, cod_semestre),
    CONSTRAINT ck_calif CHECK
                   ((espanol BETWEEN 1 AND 100)
                        AND
                        (matematicas BETWEEN 1 AND 100)
                        AND
                        (sociales BETWEEN 1 AND 100)
                        AND
                        (naturales BETWEEN 1 AND 100)));

El siguiente bloque anónimo usa dos bucles, uno para generar una secuencia de 1 al 10 usado para llenar el campo código del estudiante; El segundo bucle genera una secuencia de 1 al 2 el cual representa los códigos de semestres de cada estudiante. En la parte más interna de los buques generamos calificaciones de manera aleatorias con la función VALUE del paquete DBMS_RANDOM.

DECLARE
    v_rec_calif     hr.calificaciones%ROWTYPE;
BEGIN
    FOR i IN 1..10 LOOP 
        FOR j IN 1..2 LOOP
            v_rec_calif.cod_estudiante := i;
            v_rec_calif.cod_semestre := j;
            v_rec_calif.espanol := TRUNC(DBMS_RANDOM.VALUE(1,101));
            v_rec_calif.matematicas := TRUNC(DBMS_RANDOM.VALUE(1,101));
            v_rec_calif.sociales := TRUNC(DBMS_RANDOM.VALUE(1,101));
            v_rec_calif.naturales := TRUNC(DBMS_RANDOM.VALUE(1,101));

            INSERT INTO hr.calificaciones
            VALUES v_rec_calif;
        END LOOP;

        COMMIT;
    END LOOP;
END;

Consultamos los valores generados en la tabla calificaciones.

SELECT 
      cod_estudiante    AS estudiante,
      cod_semestre      AS semestre,
      espanol,
      matematicas,
      sociales,
      naturales,
      (espanol+matematicas+sociales+naturales)/4 AS promedio
FROM hr.calificaciones;

Resumen

El paquete DBMS_RANDOM de Oracle permite generar valores aleatorios de forma sencilla y eficiente, siendo especialmente útil para pruebas, simulaciones y creación de datos de ejemplo. En este post se presentan ejemplos prácticos del uso de las funciones NORMAL, RANDOM, STRING y VALUE, mostrando cómo generar números con distribución normal, valores enteros aleatorios, cadenas de texto y números dentro de rangos específicos. Con estas herramientas, Oracle facilita la automatización y construcción de escenarios más dinámicos dentro de PL/SQL.