[Résolu] Générer une nouvelle clé

Générer une nouvelle clé [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 08-12-2006 à 17:20:09    

Bonjour,

 

Je travaille dans le mainframe (donc Cobol et DB2).Je dois insérer une ligne dans dans une table en générant la clé primaire. Cette clé est une chaîne de 15 caractères. Je souhaiterais savoir comment m'y prendre pour générer une clé non présente en table ?

 

Merci pour votre aide.


Message édité par Kilyn le 14-12-2006 à 17:31:27

---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 08-12-2006 à 17:20:09   

Reply

Marsh Posté le 11-12-2006 à 12:53:29    

Ca dépends des caractères...
 
Tu peux nous donner plus d'infos ?

Reply

Marsh Posté le 11-12-2006 à 12:54:54    

plusieurs possibilitées :
- En utilisant une séquence, à voir ca je n'ai jamais essayé
- En définissant un timestamp WITH DEFAULT comme clé. Lors de l'insert si tu ne donnes pas de valeur pour le timestamp il prendra le CURRENT_TIMESTAMP. mais l'inconvénient est que c'est du 26 de long et tu veux du 15.
- en essayant de trouver un équivalant à ceci en version mainframe :  http://www-128.ibm.com/developerwo [...] laka2.html

Reply

Marsh Posté le 11-12-2006 à 14:10:19    

Faut surtout voir ce qu'il veut générer.
 
Habituellement, ce qu'on fait :
- TRIGGER "before insert" qui lance une PS
- Cette PS va générer le prochain numéro de commande en suivant les règles décidées.
 
Par exemple :
 
Format du numéro :
 
CDEYYYYMMNNNNNN
 
Avec "CDE" : chaîne fixe
YYYY : Année
MM : Mois
NNNNNN : Comtpeur
 
Alors le trigger :
1 - Lock la table
2 - appelle la génération du numéro
3 - insère la ligne
4 - Unlock la table
 
La fonction de génération :
1 - recherche le MAX(to_number(substr(cde_id, 10, 6))) dans la table
2 - effecture un LPAD(to_char(new_id), '0', 6)
3 - retourne CDE || to_char(sysdate, 'YYYYMMDD') || newid
 
Mais évidement, c'est différent pour chaque cas... :spamafote:
 
On peut aussi passer par une séquence si on ne veux pas réinitialiser le compteur à chaque mois

Reply

Marsh Posté le 11-12-2006 à 16:03:59    

Merci pour vos réponses. Il s'agit de chaînes de caractères avec un format non défini. L'insertion se fait via un programme à la demande (one shot).
J'arrive à faire le max mais après ? J'ai un timestamp dans la table. En fait j'y capte que dalle. Et je ne pense pas avoir les droits pour créer une séquence.

 

PS : c'est ELLE. :whistle:


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Marsh Posté le 11-12-2006 à 16:47:32    

Kilyn a écrit :

Il s'agit de chaînes de caractères avec un format non défini.


 
c'est à dire ?
 
la référence peut être "TOTOVAÀLAPLAGE" ?
(ça fait bien 15 caractères)
 
Ou si c'est des chiffres ?
 
Pour créer une séquence, consulte la doc de DB2, moi je ne maîtrise qu'Oracle. Logiquement ça doit être similaire, mais c'est possible que comme SQL Server, DB2 ne supporte pas ce type d'objet.
 
Regarde alors si y'a moyen de transcrire le champ en NUMERIC(15) à la place. Dans ce cas, si DB2 le permet, tu peux spécifier une numérotation automatique à la place de la séquence (ce que propose SQL Server par exemple).
 
Dans le cas d'une séquence, habituellement, le SGBD est incapable de la lier automatiquement à un champ d'une table.
Il faut donc écrire un trigger sur INSERT qui va récupérer le NEXTVAL afin de l'insérer dans la table.
 
Dans tous les cas, défini une PK ou une simple clé unique sur le champ, afin de garantir qu'il sera unique : au cas où la génération ramène un doublon, on vaut mieu planter sauvagement et rollbacker la transaction plutôt que de mettre n'importe quoi dans la table.

Reply

Marsh Posté le 11-12-2006 à 20:37:57    

voici quelques méthode détaillées mais surtout pour générer des nombres automatiquement : http://www.db2portal.com/2006/09/s [...] lumns.html

Reply

Marsh Posté le 14-12-2006 à 17:29:50    

Bon en fait je travaille en dev dans un environnement pourrie. Cela justifie la valeur étrange de certaines clés. Au final ce sont des numériques contenus dans des chaînes de caractères.
Il suffit juste de récupérer le maximum de cette valeur dans une variable chaîne de même taille que le champ.
Puis on met cette variable dans une variable numérique de même taille dont on ajoute 1 par la suite.
Enfin on met le résultat dans la variable alpha qu'on peut réutiliser par la suite.

 

Voilà et désolée pour la demande finalement inutile. :jap:


---------------
Nous ne sommes pas des êtres humains vivant une exprérience spirituelle. Nous sommes des êtres spirituels vivant une expérience humaine.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed