1. Introdução
Desde as versões iniciais da PL/SQL, o banco de dados Oracle disponibiliza os chamados built-in packages para seus usuários. Estes “pacotes prontos” estendem a funcionalidade do Oracle (tanto a linguagem PL/SQL, como a SQL), adicionando um imenso número de novos recursos que facilitam o trabalho de DBA's, analistas de sistemas e desenvolvedores. Quando utilizamos a expressão “imenso número”, não há exagero algum: o manual de referência que cobre os built-in packages da versão 11g do Oracle possui mais de 5.000 páginas!
Este artigo apresenta um built-in package muito útil e pouco conhecido: o DBMS_RANDOM, que é utilizado para a geração automática de números aleatórios. Estes números possuem diversas aplicações práticas, especialmente em programas onde seja necessário implementar algum tipo de rotina para realizar o “sorteio” de alguma coisa.
Normalmente, o pacote DBMS_RANDOM fica automaticamente disponibilizado para utilização logo após a instalação padrão do Oracle (isto é válido até mesmo para o Oracle XE). Desta forma, não será necessária nenhuma configuração adicional para executar os exemplos desse artigo. Caso isto não esteja ocorrendo no ambiente utilizado por você, consulte o DBA da sua empresa para que ele garanta o acesso de sua aplicação ao pacote DBMS_RANDOM.
2. DBMS_RANDOM – Apresentação
O pacote DBMS_RANDOM é bastante simples, possuindo os seguintes subprogramas:
VALUE (função): gera um número aleatório.
STRING (função): gera uma string aleatória.
SEED (procedure): configura ou reseta uma semente.
NORMAL (função): retorna números aleatórios de uma distribuição normal.
Existem também alguns subprogramas obsoletos, que continuam disponíveis na versão Oracle 11g do Oracle apenas por questões de compatibilidade com versões anteriores. São eles:
INITIALIZE (procedure): inicializa o pacote com um valor de semente.
TERMINATE (procedure): encerra o pacote.
RANDOM (procedure): gera um número aleatório.
Estes subprogramas não serão abordados no artigo. Para maiores informações consulte o manual “Oracle® Database PL/SQL Packages and Types Reference”.
Esta é a principal função do pacote. Possui duas versões:
DBMS_RANDOM.VALUE RETURN NUMBER: é a versão básica, utilizada sem parâmetros. Gera um número aleatório maior ou igual a 0 e menor do que 1, com 38 dígitos de precisão.
DBMS_RANDOM.VALUE(lim_inf IN NUMBER, lim_sup IN NUMBER) RETURN NUMBER: é a versão alternativa. Gera um número aleatório N, maior ou igual a “lim_inf” e menor do que “lim_sup”.
Alguns exemplos de utilização:
(1) produz número aleatório no intervalo [0,1), ou seja, com valor maior ou igual a 0 e menor do que 1. O número possuirá 38 dígitos de precisão.
SQL> SELECT DBMS_RANDOM.VALUE FROM DUAL;
VALUE
0,625648516
SQL> SELECT DBMS_RANDOM.VALUE(1,5) FROM DUAL;
VALUE
----------
2,12440689
(3) para produzir um número aleatório inteiro, podemos utilizar a função ROUND do Oracle. O exemplo gera um inteiro maior ou igual a 1 e menor ou igual a 5:
SQL> SELECT ROUND(DBMS_RANDOM.VALUE(1,5)) FROM DUAL;
VALUE
----------
4
Na parte seguinte iremos mostrar DBMS_RANDOM.STRING e DBMS_RANDOM.NORMAL