IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Cours sequence Oracle


Sujet :

Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 34
    Points
    34
    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.

  2. #2
    Membre habitué Avatar de Scual
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    149
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2006
    Messages : 149
    Points : 189
    Points
    189
    Par défaut
    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

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Points : 34
    Points
    34
    Par défaut
    J'ai passé les commandes suivantes pour tester le fonctionnement :

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

    Je n'arrive pas à comprendre ce résultat.

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    on peut imaginer que le NEXTVAL est exécuté avant le CURRVAL dans la 2° ligne.

  5. #5
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Citation Envoyé par pegase06 Voir le message
    J'ai passé les commandes suivantes pour tester le fonctionnement :

    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);
    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 : 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

  6. #6
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    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 : 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
    ça pue un peu le bug je trouve...

  7. #7
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    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.

  8. #8
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    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 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

  9. #9
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    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 !

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    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 : 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
    Ma fonction f_d() n'est pas réellement DETERMINISTIC bien sûr ...
    Consultant et formateur Oracle

Discussions similaires

  1. Equivalent Sequence Oracle en SQLServer
    Par Gabbe_pro dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 25/02/2010, 21h32
  2. pb appel sequence oracle
    Par etham dans le forum Oracle
    Réponses: 3
    Dernier message: 13/11/2006, 15h05
  3. Sequence Oracle : double incrémentation
    Par woodwai dans le forum Hibernate
    Réponses: 3
    Dernier message: 10/11/2006, 13h50
  4. genID pour sequence oracle
    Par COULON dans le forum XMLRAD
    Réponses: 4
    Dernier message: 11/04/2006, 11h54
  5. [EJB2.1 Entity] EJB Entite CMP et sequence Oracle
    Par kaiser2003 dans le forum Java EE
    Réponses: 5
    Dernier message: 11/03/2006, 10h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo