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.
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:
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.
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.
Publicar un comentario