Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/01/2008, 10h34   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
Par défaut Cours sequence Oracle

Bonjour,

je recherche un cours sur les séquence en oracle, et sur les méthodes curval et nextval.

Merci pour votre aide.
pegase06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 11h14   #2
Membre actif
 
Avatar de Scual
 
Inscription : avril 2006
Messages : 149
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : avril 2006
Messages : 149
Points : 185
Points : 185
Envoyer un message via MSN à Scual
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
Scual est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2008, 11h57   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
J'ai passé les commandes suivantes pour tester le fonctionnement :

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);
Le résultat est :
{1,1}
{2,2}
{2,2}.

Je n'arrive pas à comprendre ce résultat.
pegase06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 09h00   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
on peut imaginer que le NEXTVAL est exécuté avant le CURRVAL dans la 2° ligne.
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 11h28   #5
Rédacteur
 
Inscription : décembre 2002
Messages : 2 397
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 397
Points : 3 298
Points : 3 298
Citation:
Envoyé par pegase06 Voir le message
J'ai passé les commandes suivantes pour tester le fonctionnement :

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);
Le résultat est :
{1,1}
{2,2}
{2,2}.

Je n'arrive pas à comprendre ce résultat.
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
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 11h46   #6
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Citation:
Envoyé par Pomalaix Voir le message
Très intéressant ce test !
Si on m'avait demandé de prévoir les résultats, j'aurais eu tout faux...
pas mieux...

d'ailleurs, la fonction est bien toujours appellée :
Code :
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
ça pue un peu le bug je trouve...
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 12h42   #7
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
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.
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 12h45   #8
Rédacteur
 
Inscription : décembre 2002
Messages : 2 397
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 397
Points : 3 298
Points : 3 298
Citation:
Envoyé par LeoAnderson Voir le message
SQL> select * from t;

A B
---------- ----------
1 1
2 2
2 2
3 3
5 6
Avec tes 4 premières lignes de résultats, tu sèmes le trouble...
Les valeurs ramenées par la fonction, c'est juste le 5 et le 6, c'est ça ?
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 12h50   #9
Expert Confirmé
 
Avatar de LeoAnderson
 
Inscription : septembre 2004
Messages : 2 942
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 2 942
Points : 2 972
Points : 2 972
Citation:
Envoyé par Pomalaix Voir le message
Avec tes 4 premières lignes de résultats, tu sèmes le trouble...
Les valeurs ramenées par la fonction, c'est juste le 5 et le 6, c'est ça ?
oui, bien sûr !
LeoAnderson est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2008, 13h06   #10
Membre éprouvé
 
Inscription : décembre 2007
Messages : 354
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : décembre 2007
Messages : 354
Points : 408
Points : 408
Citation:
Envoyé par LeoAnderson Voir le message
pas mieux...

d'ailleurs, la fonction est bien toujours appellée :

...

ça pue un peu le bug je trouve...
Même quand DETERMINISTIC est désigné mais Oracle fonctionne comme ça et il appelle la fonction à chaque fois

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
Ma fonction f_d() n'est pas réellement DETERMINISTIC bien sûr ...
__________________
Consultant et formateur Oracle
Michel SALAIS est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h16.


 
 
 
 
Partenaires

Hébergement Web