Bonjour,
je recherche un cours sur les séquence en oracle, et sur les méthodes curval et nextval.
Merci pour votre aide.
Bonjour,
je recherche un cours sur les séquence en oracle, et sur les méthodes curval et nextval.
Merci pour votre aide.
Bonjour,
une recherche sur tahiti.oracle.com de "sequence" dans 10g R2 t'aurait renvoyé sur ce lien :
http://download.oracle.com/docs/cd/B...s.htm#i1106548
Bonne journée.
Scual
Diction de DBA :
"Tant va la cruche à l'eau qu'à la fin, ça me les brise"
-------------------------------------
Working on Oracle Database 10g / 11g
-------------------------------------
Article d'installation d'Oracle 10g AS Portal by Maxime GONTCHAROV
labo-oracle.com
J'ai passé les commandes suivantes pour tester le fonctionnement :
Le résultat est :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 CREATE SEQUENCE seq START WITH 1 INCREMENT BY 1; CREATE TABLE t (a INTEGER, b INTEGER); -- Statement #1 INSERT INTO t VALUES (seq.NEXTVAL, seq.NEXTVAL); -- Statement #2 INSERT INTO t VALUES (seq.CURRVAL, seq.NEXTVAL); -- Statement #3 INSERT INTO t VALUES (seq.CURRVAL, seq.CURRVAL);
{1,1}
{2,2}
{2,2}.
Je n'arrive pas à comprendre ce résultat.
on peut imaginer que le NEXTVAL est exécuté avant le CURRVAL dans la 2° ligne.
Très intéressant ce test !
Si on m'avait demandé de prévoir les résultats, j'aurais eu tout faux...
Il en ressort effectivement que :
- si on fait appel à CURRVAL et NEXTVAL dans la même instruction, NEXTVAL est calculé en premier
- si on fait appel plusieurs fois à NEXTVAL dans la même instruction, le numéro n'est pas incrémenté, et se comporte donc tout à fait comme une valeur issue d'une table.
Il n'en est pas de même si on appelle plusieurs fois dans la même instruction une fonction non déterministe : celle-ci est bien recalculée à chaque fois.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 select dbms_random.normal, dbms_random.normal from dual; NORMAL NORMAL ---------- ---------- ,504109856 ,223223233
Consultant / formateur Oracle indépendant
Certifié OCP 12c, 11g, 10g ; sécurité 11g
Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration
pas mieux...
d'ailleurs, la fonction est bien toujours appellée :
ça pue un peu le bug je trouve...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 SQL>create or replace function proc_val return number is ln$val number; begin select seq.nextval into ln$val from dual; return ln$val; end; / SQL>show errors function proc_val SQL> insert into t values (proc_val, proc_val); 1 row created. SQL> select * from t; A B ---------- ---------- 1 1 2 2 2 2 3 3 5 6
Déroutant mais documenté:
The pseudo-column NEXTVAL can be used to generate as many new sequence numbers as necessary. However, only a single sequence number can be generated for each row. In other words, if NEXTVAL is referenced more than once in a single statement, then the first reference generates the next number, and all subsequent references in the statement return the same number.
Consultant / formateur Oracle indépendant
Certifié OCP 12c, 11g, 10g ; sécurité 11g
Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration
Même quand DETERMINISTIC est désigné mais Oracle fonctionne comme ça et il appelle la fonction à chaque fois
Ma fonction f_d() n'est pas réellement DETERMINISTIC bien sûr ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 drop sequence seq drop sequence seq succeeded. create sequence seq create sequence succeeded. create or replace function f return number as l_seq number; begin select seq.nextval into l_seq from dual; return l_seq; end; function f Compiled. create or replace function f_d return number deterministic as l_seq number; begin select seq.nextval into l_seq from dual; return l_seq; end; function f_d Compiled. select f(), f_d(), f(), f_d() from dual F() F_D() F() F_D() ---------------------- ---------------------- ---------------------- ---------------------- 1 2 3 4 1 rows selected
Consultant et formateur Oracle
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager