Bonjour,
je recherche un cours sur les séquence en oracle, et sur les méthodes curval et nextval.
Merci pour votre aide.
Version imprimable
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
J'ai passé les commandes suivantes pour tester le fonctionnement :
Le résultat est :Code:
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:
1
2
3
4
5 select dbms_random.normal, dbms_random.normal from dual; NORMAL NORMAL ---------- ---------- ,504109856 ,223223233
pas mieux... :oops:
d'ailleurs, la fonction est bien toujours appellée :
ça pue un peu le bug je trouve... 8OCode:
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é:
Citation:
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.
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:
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