Sequence - Probleme avec les nombres générés [RESOLU][ORACLE] - SQL/NoSQL - Programmation
Marsh Posté le 25-06-2008 à 10:59:10
ne pas incrémenter ta séquence ou utiliser la valeur courante si tu n'as aucun besoin de l'incrémenter
Marsh Posté le 25-06-2008 à 11:30:26
Desolé jai pas compris ce que tu veux dire. Si je n'incremente pas la sequence, elle ne me sert à rien si je veux un numero unique pour chaque employee unique Par ailleurs si j'utilise juste CurrVal, je me retrouve avec "CURRVAL is not yet defined in this session"
Marsh Posté le 01-07-2008 à 18:57:09
tu veux dire que ta séquence s'incrémente même lorsqu'il ne passe pas dans le "when not match" ???
étrange. ça donne quoi si tu tentes de fait un dbms.output dans ton "when not match" ?
Marsh Posté le 01-07-2008 à 23:53:22
En fait je ne peux pas t'affirmer qu'elle s'incremente aussi quand je suis pas dans le "when not match", mais ce que je peux te dire c'est que la "Next value" est à 13000, qques chose comme ca apres la premiere execution.
Je refais des tests demain.
Merci pour la reponse.
++
Marsh Posté le 02-07-2008 à 09:37:31
Alors rectification, jai effacé toute la table et reexecuter mon job (qui appel la procedure mise dans mon premier post). Pour 9592 entrée dans la table, la sequence a comme prochaine value 9601, donc déjà il y a un probleme là.
Ensuite, apres une deuxieme execution le "Next number" est à 19201. Sachant que normalement ca devrait toujours etre à 9592 vu qu'il n'y a pas de nouveau employé ni de mise à jour à faire.
Troisieme execution, "Next number" est à 28781.
J'ai mis un DBMS_OUTPUT.PUT_LINE('This is a test'); apres le Insert dans le when not match, mais jai rien sur la sortie.
Marsh Posté le 02-07-2008 à 10:15:18
T'est sûr que t'as pas un trigger ou autre connerie qui traîne ?
Parceque là c'est très étrange quand même...
Crée une seconde séquence bidon, et utilise-là dans ta PS au lieu d'appeler l'actuelle, voir si c'est bien ta PS qui incrémente le compteur...
Parceque si ton code c'est juste ce que t'as posté, pour moi y'a un bon gros bug des familles d'Oracle... Et il est tellement énorme... que j'ai du mal à y croire.
Marsh Posté le 02-07-2008 à 10:16:36
(juste comme ça, t'appelles pas ta séquence dans le update ?)
Marsh Posté le 02-07-2008 à 10:38:14
Re,
Alors apres verification, non jai pas fait l'erreur d'appeler 2 fois ma sequence dans la procedure. La sequence semble aussi bien utilisée que par une seule procedure puisqu'avec PL/SQL Developer, si je regarde dans "Referenced by" sous Sequences -> Ma_Sequence, et bien il y a seulement que ma procedure référencée.
Je pense que jai du faire une erreur dans le code, si les sequence étaient "buggée" sous oracle, ca se serait.
Marsh Posté le 02-07-2008 à 10:53:34
MagicBuzz a écrit : |
seconde sequence créée et utilisée a la place de l'autre, je me retrouve avec les memes valeur de sequence: 9601, 19201, 28781...
Sinon concernant le
# EXCEPTION
# WHEN DUP_VAL_ON_INDEX THEN
# ROLLBACK;
jsuis pas sur que l'exception soit bonne, je l'ai viré pour les tests mais ca ne change rien à la sequence.
Marsh Posté le 02-07-2008 à 11:10:51
cervantes a écrit : |
Tu n'imagines pas le nombre de trucs apparemment sains sous Oracle qui en fait sont buggés à mort, à commencer par Oracle lui même
bon sinon pour ton souci : t'aurais pas un trigger qui fout la merde quelque part ? essaie de faire un SELECT SEQ_NO_EMPLOYEE.NextVal FROM Dual, pour voir la prochaine valeur immédiatement disponible après ton insert
Marsh Posté le 02-07-2008 à 11:26:13
Code :
|
Sinon, pour ecarter toute ambiguité sur les sequences buggées ou non sur Oracle (j'utilise pourtant une version recente: 10gR2), y a t-il une autre facon d'incrementer un champ de type integer, enfin un truc qui remplace les seqences?
Avant d'utiliser une sequence, javais penser faire une fonction du type, pour chaque new insert, je recupere avec un select sur la table pour avoir la plus grande valeur dans ma colonne "empno" et je l'incremente de 1. J'ai laisse cette idée des que je suis tombé sur les sequences.
Marsh Posté le 02-07-2008 à 12:18:38
Mettre ton appelle à la séquence dans un trigger qui se trouve sur le "BEFORE INSERT" de ta table.
C'est comme ça qu'on fait habituellement.
Comme ça lors de l'insertion, tu laisse le champ à vide (ou avec une valeur bidon s'il est NOT NULL) et la séquence s'incrémentera automatiquement à chaque insertion de ligne, avec (et surtout) l'assurance totale que tu y fais toujours appel.
A froid, je dirais qu'Oracle est très con, et estime que ce serait bien de connaître le nextval même s'il n'entre pas dans ton when.
En passant par le trigger, à moins qu'Oracle décide d'insérer des lignes tout seul, il n'y aura plus de problème.
En tout cas, pour moi il s'agit clairement d'un bug d'Oracle (peut-être voulu ceci dit)
Marsh Posté le 02-07-2008 à 12:21:48
ça devrait donner un truc de ce genre :
Code :
|
Marsh Posté le 02-07-2008 à 15:46:31
C'est exactement ca. Avec un trigger et en supprimant dans la commande insert le nextval de la sequence, jai une bonne autoincrementation.
Restera l'interrogation sur pourquoi ma premiere implementation ne marche pas.
Merci bien MagicBuzz
Marsh Posté le 25-06-2008 à 10:23:22
Slt,
j'utilise une sequence pour remplir le champ "empno", clé primaire d'une table d'information d'employée.
J'utilise ensuite un job qui execute quotidiennement la procedure suivant pour mettre a jour les données d'employees ou pour ajouter les nouveaux employee:
J'ai un soucis avec ma sequence, car apres chaque execution de cette procedure, bien qu'aucun employee ne soit mise à jour ou ajouté dans la table j'ai ma séquence qui est incrémentée. Conséquence de ceci, c'est qu'apres 3 executions de cette stored procedure, le "NextVal" de ma sequence est à déjà plus de 20000! Sachant que ma stored procedure doit etre executé tous les jours, j'imagine pas la valeur générer au bout d'un mois :S
Comment incrementer le numero de sequence que lors d'un insert et évizer de se retouver avec de si grand nombre générer?
A+
Message édité par cervantes le 02-07-2008 à 15:46:53