Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Discussion: Cours sequence Oracle

  1. #1
    Candidat au titre de Membre du Club
    Inscrit en
    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.

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

    Informations forums :
    Inscription : avril 2006
    Messages : 149
    Points : 185
    Points
    185

    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
    Candidat au titre de Membre du Club
    Inscrit en
    décembre 2006
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : décembre 2006
    Messages : 71
    Points : 11
    Points
    11

    Par défaut

    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.

  4. #4
    Rédacteur
    Avatar de orafrance
    Inscrit en
    janvier 2004
    Messages
    15 959
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 959
    Points : 17 228
    Points
    17 228

    Par défaut

    on peut imaginer que le NEXTVAL est exécuté avant le CURRVAL dans la 2° ligne.

  5. #5
    Rédacteur

    Profil pro
    Inscrit en
    décembre 2002
    Messages
    2 811
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : décembre 2002
    Messages : 2 811
    Points : 4 530
    Points
    4 530

    Par défaut

    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

  6. #6
    Expert Confirmé Avatar de LeoAnderson
    Inscrit en
    septembre 2004
    Messages
    2 940
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 2 940
    Points : 3 028
    Points
    3 028

    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 :
    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
    Expert Confirmé
    Inscrit en
    février 2006
    Messages
    3 435
    Détails du profil
    Informations forums :
    Inscription : février 2006
    Messages : 3 435
    Points : 3 479
    Points
    3 479

    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

    Profil pro
    Inscrit en
    décembre 2002
    Messages
    2 811
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : décembre 2002
    Messages : 2 811
    Points : 4 530
    Points
    4 530

    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 10g et 11g, sécurité 11g

  9. #9
    Expert Confirmé Avatar de LeoAnderson
    Inscrit en
    septembre 2004
    Messages
    2 940
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 2 940
    Points : 3 028
    Points
    3 028

    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 éprouvé
    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 : 411
    Points
    411

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •