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?
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;
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;
6
SQL> sélectionnez Random parmi dual;
9
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;
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.
Entiers:
select dbms_random.random from dual
Entiers positifs:
select abs(dbms_random.random) from dual
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.