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

PL/SQL Oracle Discussion :

Ma séquence attribue un même numéro


Sujet :

PL/SQL Oracle

  1. #1
    Invité
    Invité(e)
    Ma séquence attribue un même numéro
    Bonjour,
    J'ai un souci avec ma sequence.quand je saisi elle m'attribut le meme numero.par exemple si je fait la peremiere saisi elle me donne le numero 2020201 quand je passe une nouvelle saisi elle attribut le meme 2020201 en me demandant voulez vous enregistrer les modification?
    Merci de me lire et
    Merci d'avance.

  2. #2
    Membre expérimenté
    Salut,

    Comment la séquence a t-elle été créée?
    Que donne sous SQLPlus
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT dbms_metadata.get_ddl('SEQUENCE', 'nom_sequence', 'owner' from dual;
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  3. #3
    Invité
    Invité(e)
    Au faite au début c'est la séquence qui a sauté plusieurs numéros. Apres je voudrais remplacer les numéros sauté par la sequence.
    Donc pour cela il faut toucher le programme. voila ce qui à été mais quand on saisie elle attribue le même numéro elle n'avance pas.
    Pourquoi elle n'avance?

    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
    declare
    v_numd number;
    trouve varchar2(1);
    cursor c_numd is select numero_d from entete_dm where numero_d=v_numd;
    r_numd c_numd%rowtype;
     
     
    BEGIN
    	trouve:='n';
      v_numd:=20194001;
     
      while trouve = 'n' loop
      	open c_numd;
      	fetch c_numd into r_numd;
      		if c_numd%found then
      			v_numd:=v_numd+1;
     
      		else
      			trouve:='o';
      			:num_d:=v_numd;
      		end if;
      		close c_numd;
      end loop;
     
     
    END;



    Merci

  4. #4
    Membre expérimenté
    Ah mais ce n'est pas une vraie séquence...
    Une séquence c'est quand tu fais un CREATE SEQUENCE...

    Visiblement tu as un pb de boucle ou de test.
    Je te conseille d'utiliser dbms_output.put_line dans ta boucle pour afficher toutes les variables que tu utilises : ce sera une sorte de débuggage et tu devrais comprendre d'où viens le problème.
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  5. #5
    Expert éminent
    Quelques conseils :
    1/ Pas de curseur quand tu fais juste un SELECT d'une seule valeur, il suffit de gérer le NO_DATA_FOUND quand la ligne n'existe pas
    2/ Pour les curseurs, mieux vaut utiliser une FOR LOOP END LOOP, que les OPEN CURSOR, FETCH, CLOSE CURSOR
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Invité
    Invité(e)
    Merci beacucoup.
    J'ai pu m'ensortir avec la boucle FOR LOOP.




    Cdlt!

  7. #7
    Expert éminent
    Solution avec le select
    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
    DECLARE
    	v_numd number :=20194001;
    	v NUMBER;
    BEGIN
      LOOP
        BEGIN
           SELECT 1 INTO v
          FROM entete_dm
          WHERE numero_d=v_numd
          -- On a trouvé, on continue
    	v_numd := v_numd + 1;  
     
         EXCEPTION WHEN NO_DATA_FOUND THEN  -- Pas trouvé, on affecte et on sort
        	  :num_d := v_numd;
            EXIT;  
        END;
      END LOOP;
    END;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  8. #8
    Invité
    Invité(e)
    Merci McM,ça aussi sa marche et c'est même moins encombrant.











    cdlt!

###raw>template_hook.ano_emploi###