Anuncios en tutorial de programación PLSQL

miércoles, 19 de mayo de 2021

Generador de números aleatorios en PL/SQL

Es posible que en alguna ocasión necesitéis utilizar un generador de números aleatorios en un programa PL/SQL. Oracle proporciona el paquete estándar DBMS_RANDOM para este propósito. Obviamente podemos escribir nuestra propia rutina PLSQL que genere números aleatorios, pero paquete estándar de Oracle DBMS_RANDOM es más rápido ya que llama al generador de números aleatorios interno de la base de datos Oracle.

Números aleatorios

Los procedimientos y funciones que incluye este paquete son:

INITIALIZE: Inicializa el valor de la semilla del generador de números aleatorios.

EXEC dbms_random.initialize(12345678);

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;

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;

SEED: Reinicializa el valor de la semilla

EXEC dbms_random.seed(87654321);

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;

TERMINATE: Indica que hemos terminado de usar el paquete DBMS_RANDOM.

dbms_random.terminate;

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;

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;

2 comentarios:

Evaristo Páramos dijo...

Hola, tienes un ejemplo de una Función que utilice cursores...es que me salen errores de compilación.

CREATE OR REPLACE
FUNCTION salario_promedio()
RETURN NUMBER IS
promedio NUMBER(5) := 0;
BEGIN
FOR orden IN
SELECT salario from empleado)
LOOP
DBMS_OUTPUT.PUT_LINE(orden.salario);
promedio := promedio + orden.salario;
END LOOP;
RETURN (promedio);
END;


Gracias.

JLPM dijo...

Rey de los Bosques,

Deberías investigar un poco más antes de preguntar. Hay bastantes errores en la función que has escrito.

Echa una ojeada a esta entrada sobre cursores en PL/SQL. Supongo que te ayudará a comprender los distintos formatos que pueden tomar los cursores de PLSQL.