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