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 :

sequence d'auto-incrementation


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut sequence d'auto-incrementation
    bonjour,

    j'ai plusieurs tables avec des champs à auto-incrémenter.

    le problème c'est que mes tables sont deja remplies.

    je voudrai faire une sequence du style

    create sequence seq_nbclt
    start with "select max(ndbclt)+1 from client"
    increment by 1

    mais ca marche pas ...
    comment dois-je faire ?
    d'avance merci

  2. #2
    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
    Avec du sql dynamique (http://sheikyerbouti.developpez.com/execute_immediate/) et un spool tu peux générer ton script... voila une idée non testée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    spool c:\toto.txt
    DECLARE
    stmt varchar2(4000);
    max_seq integer;
    BEGIN
    FOR i in (select table_name from all_tables where table_name in (<liste des tables) LOOP
         EXECUTE IMMEDIATE ('select max(id) from ' || i.table_name') INTO max_seq;
         stmt := 'create sequence seq_'||(substr(i.table_name,1,26)||' start with ' || max_seq || ' increment by 1;';
    DBMS_OUTPUT.PUT_LINE(stmt);
    END LOOP;
    END;
    spool off

  3. #3
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    j'ai essayé ta procédure mais elle ne fonctionne pas

    y a pas de message d'erreur mais quand je la copie dans sql plus, apres avoir défini la liste des tables, et que je fais entrée il passe a la ligne mais ne l'execute pas. Il crée juste le fichier toto.txt.

  4. #4
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Hooo laaaa !!!
    8) 8) 8) : c'est du lourd

    Ben Rajoute un " / " entre "END;" et "Spool Off"
    Signé : Capitaine Jean-Luc Picard

  5. #5
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    marche pas aussi
    voila ce que j'essai de lancer pour créer la sequence pour une table pour commencer. J'ai une 30aine de tables, il est vrai que ca m'arrangerai que la premiere solution proposée fonctionne.

    spool c:\toto.txt
    DECLARE
    max_seq integer;
    stmt varchar2(4000);
    BEGIN
    EXECUTE IMMEDIATE ('select max(NDBACCUEIL) from ' || accueil') INTO max_seq;
    stmt := 'create sequence seq_accueil start with ' || max_seq || ' increment by 1;';
    DBMS_OUTPUT.PUT_LINE(stmt);
    END; /
    spool off

  6. #6
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    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
    set serveroutput on
     
    spool toto.txt
    DECLARE
    stmt varchar2(4000);
    max_seq integer;
    Begin
    For i in (select table_name from all_tables where table_name in (<Liste des Tables> )) LOOP
         Execute Immediate ('select max(id) from ' || i.table_name ) INTO max_seq;
         stmt := 'create sequence seq_' || substr(i.table_name,1,26)||' start with ' || max_seq || ' increment by 1;';
         Dbms_Output.Put_Line(stmt); 
    End Loop;
    End;
    /
    spool off
    Signé : Capitaine Jean-Luc Picard

  7. #7
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    y a du mieux j'ai des résultats...

    mais quel résultat j'ai des erreurs. Il me dit impossible utilisation de l'operateur i invalide et me fait une erreur au niveau de la derniere table que je déclare

    c'est l'erreur ora 06550

  8. #8
    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
    attention, j'ai mis select max(id) from mais ceci entend que id est une colonne de la table

  9. #9
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    arf

    et comment je peux faire pour chopper le nom de la premiere colonne de la table en cours pour remplacer le id

    sinon je me suis aperçu que ca ne crée pas la sequence mais m'affiche juste la requete pour la créé. Comment je dois faire pour qu'il l'a crée.
    un truc genre EXECUTE SQL (stmt);

    Sinon j'ai des tables qui sont vides donc dans ce cas la sequence ne marchera pas puisqu'elle aura comme valeur NULL donc si tu vois contourner ca aussi ...

  10. #10
    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
    bah là tu peux pas puisqu'une séquence n'est pas attachée à une colonne en particulier

    Soit tu as été malin et le nom de la colonne est dans le nom de la séquence (ex : macolonne_SEQ) un SUBSTR fera l'affaire

    Soit t'as pas été malin et tu dois te farcir un DECODE pas possible
    DECODE(table_name, tab1, col1, tab2, col2...)

  11. #11
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    oui donc ces bon pour les colonnes je peux me debrouiller j'ai des colonnes du type 'ndb<nom table' donc pour ca je peux y arriver.

    mais pour ce qui est de créer les sequences comment dois-je faire ??

    pour l'instant ca affiche stmt mais l'execute pas.

  12. #12
    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
    à la place de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dbms_Output.Put_Line(stmt);
    Tu écris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    execute immediate(stmt);
    Il faut penser à enlever le ; de la chaine stmt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE 
    stmt varchar2(4000); 
    max_seq integer; 
    BEGIN 
    FOR i in (select table_name from all_tables where table_name in (<liste des tables) LOOP 
         EXECUTE IMMEDIATE ('select max(id) from ' || i.table_name') INTO max_seq; 
         stmt := 'create sequence seq_'||(substr(i.table_name,1,26)||' start with ' || max_seq || ' increment by 1'; 
    EXECUTE IMMEDIATE(stmt); 
    END LOOP; 
    END;
    /

  13. #13
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    d'accord masi ca ne marche pas, voila ce que je fais :
    tabnom c'est un tableau contenant les noms de mes tables et y a une boucle for pour incrementer i.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXECUTE IMMEDIATE ('SELECT max(ndb' ||tabnom(i)|| ')+1 FROM ' ||tabnom(i) )INTO max_seq;
     stmt:= 'CREATE SEQUENCE seq_'||tabnom(i)||' START WITH ' || max_seq || ' INCREMENT BY 1';
    EXECUTE IMMEDIATE(stmt);
    et voila l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE
    *
    ERREUR à la ligne 1 :
    ORA-00955: Ce nom d'objet existe déjà
    ORA-06512: à ligne 22

  14. #14
    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
    il faut dropper les séquences avant de les recréer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    DECLARE 
    stmt varchar2(4000); 
    stmt_drop varchar2(4000); 
    max_seq integer; 
    BEGIN 
    FOR i in (select table_name from all_tables where table_name in (<liste des tables) LOOP 
         EXECUTE IMMEDIATE ('select max(id) from ' || i.table_name') INTO max_seq;    
         stmt_drop := 'drop sequence seq_'||(substr(i.table_name,1,26);
         stmt := 'create sequence seq_'||(substr(i.table_name,1,26)||' start with ' || max_seq || ' increment by 1'; 
    EXECUTE IMMEDIATE(stmt_drop); 
    EXECUTE IMMEDIATE(stmt); 
    END LOOP; 
    END; 
    /

  15. #15
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    je les ai toutes drop avant les sequences donc je pense pas que ca soit ca

  16. #16
    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
    Alors débugguons :

    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
    DECLARE 
    stmt varchar2(4000); 
    stmt_drop varchar2(4000); 
    max_seq integer; 
    BEGIN 
    FOR i in (select table_name from all_tables where table_name in (<liste des tables) LOOP 
         EXECUTE IMMEDIATE ('select max(id) from ' || i.table_name') INTO max_seq;    
         stmt := 'create sequence seq_'||(substr(i.table_name,1,26)||' start with ' || max_seq || ' increment by 1'; 
    BEGIN
    EXECUTE IMMEDIATE(stmt); 
    EXCEPTION WHEN OTHERS THEN
    dbms_output.put_line('Séquence en erreur : seq_'||(substr(i.table_name,1,26));
    END;
    END LOOP; 
    END; 
    /

  17. #17
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    toujours une erreur alors voila ma procedure

    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
    SQL> DECLARE
      2  TYPE typ_nomtable is VARRAY(29) of VARCHAR2(100);
      3  tabnom typ_nomtable;
      4  max_seq INTEGER;
      5  stmt VARCHAR2(4000);
      6  i INTEGER;
      7  
      8  BEGIN
      9  tabnom := typ_nomtable ('accueil', ... , 'TETarifs');
     13  
     14  FOR i in 1 .. 29 LOOP
     15   EXECUTE IMMEDIATE ('SELECT count(ndb' ||tabnom(i)|| ') FROM ' ||tabnom(i) )INTO max_seq;
     16   IF max_seq = 0 THEN
     17     stmt:= 'CREATE SEQUENCE seq_'||tabnom(i)||' START WITH 1 INCREMENT BY 1';
     18   else
     19    EXECUTE IMMEDIATE ('SELECT max(ndb' ||tabnom(i)|| ')+1 FROM ' ||tabnom(i) )INTO max_seq;
     20    stmt:= 'CREATE SEQUENCE seq_'||tabnom(i)||' START WITH ' || max_seq || ' INCREMENT BY 1';
     21   END IF;
     22  BEGIN
     23  EXECUTE IMMEDIATE(stmt);
     24  EXCEPTION WHEN OTHERS THEN
     25  dbms_output.put_line('Séquence en erreur : seq_'||tabnom(i));
     26  END;
     27    EXECUTE IMMEDIATE(stmt);
     28  END LOOP;
     29  END;
     30  /
    et l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    DECLARE
    *
    ERREUR à la ligne 1 :
    ORA-00955: Ce nom d'objet existe déjà 
    ORA-06512: à ligne 27
    a savoir qu'il crée la sequence seq_accueil bien qu'il y ai ce message d'erreur

  18. #18
    Membre à l'essai
    Inscrit en
    Août 2004
    Messages
    27
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 27
    Points : 11
    Points
    11
    Par défaut
    ces bon y avait un execute immediat de trop

    je te remercie beaucoup de ton aide ca devrait aller maintenant

  19. #19
    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
    OK, bon courage

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 16/10/2006, 15h19
  2. [MYSQL] valeur auto-increment
    Par alex1er dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/07/2003, 12h26
  3. Auto Increment
    Par Guizz dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 23/06/2003, 18h36
  4. Nom du champs auto-incrementé
    Par norroy dans le forum Requêtes
    Réponses: 2
    Dernier message: 17/06/2003, 18h30
  5. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 12h05

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