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 Programa | Descripción |
| Procedimiento INITIALIZE | Inicializa el paquete con un valor de semilla (SEED value). |
| Función NORMAL | Retorna números aleatorios en una distribución normal. |
| Procedimiento RANDOM | Genera números aleatorios. |
| Procedimientos SEED | Restablece 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 STRING | Genera una cadena aleatoria. |
| Procedimiento TERMINATE | Finaliza el paquete. |
| Funciones VALUE | Esta 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ámetro | Descripción |
| opt | Es 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. |
| len | Longitud 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.

