web-dev-qa-db-fra.com

PLSQL génère un entier aléatoire

Dans Oracle Sql developer 11g, comment générer un entier aléatoire et l'affecter à une variable? Voici ce que j'ai essayé jusqu'à présent:

S_TB := SELECT dbms_random.value(1,10) num FROM dual;

Avec ce code, j'ai eu une erreur:

S_TB := SELECT dbms_random.value(1,10) num FROM dual
Error report -
Unknown Command

Quelle est la bonne façon de résoudre mon problème?

6
Justin

Les variables nécessitent PL/SQL; il ne ressort pas clairement de votre question si votre code est un bloc PL/SQL approprié. Dans PL/SQL, les variables sont remplies à partir de requêtes utilisant la syntaxe INTO plutôt que la syntaxe d'affectation que vous utilisez.

declare
    txt varchar2(128);
    n pls_integer;
begin
    --  this is how to assign a literal
    txt := 'your message here';

    --  how to assign the output from a query
    SELECT dbms_random.value(1,10) num 
    into n
    FROM dual;

end;

Cependant, vous n'avez pas besoin d'utiliser la syntaxe de requête. Ceci est valable et une meilleure pratique:

declare
    n pls_integer;
begin
    n := dbms_random.value(1,10);
end; 
17
APC

Alternativement, vous pouvez créer une fonction pour générer des nombres aléatoires. Cela peut être utilisé n'importe où dans le code.

    create or replace function RANDOM
    return number 
    is 
    a number ; 
    begin
    select round(dbms_random.value(1,10)) rnum
    into a 
    from dual;
    return a  ;
    end;
    /

PRODUCTION:

Fonction créée.

SQL> sélectionnez Random parmi dual;

ALÉATOIRE

     6                                                                                                                  

SQL> sélectionnez Random parmi dual;

ALÉATOIRE

     9                                                                                                                  
5
mahi_0707

Si vous souhaitez obtenir un nombre aléatoire de n chiffres, vous pouvez le faire

CREATE OR REPLACE FUNCTION NUM_RANDOM(N IN NUMBER)
RETURN NUMBER 
AS 
BEGIN
    RETURN TRUNC (DBMS_RANDOM.VALUE(POWER(10, N - 1), POWER(10, N) - 1));
END NUM_RANDOM;
4
Monicalh

Pour un ensemble d'entiers consécutifs distribués de manière uniforme et uniforme (dans l'exemple ci-dessous entre 1 et 10), je suggère:

select round(dbms_random.value(0.5,10.49999999999),0) from dual

Sinon, je limiterai involontairement le premier et le dernier nombre de l'ensemble à la moitié de la probabilité d'être choisi comme le reste de l'ensemble.

3
TastySlowCooker

Entiers:

select dbms_random.random from dual

Entiers positifs:

select abs(dbms_random.random) from dual
1
ThePolyhedric
DECLARE
l_check Integer:=1;
BEGIN
    WHILE l_check < 5 LOOP
        l_check := DBMS_RANDOM.VALUE(1,10);
        DBMS_OUTPUT.PUT_LINE(l_check);
    END LOOP;
END;

- DBMS_RANDOM.VALUE Donne la valeur aléatoire dans la plage.

0
Krishna