Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1767 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1488764
Kilyn
Milé sek milé
Posté le 08-12-2006 à 17:20:09  profilanswer
 

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.
mood
Publicité
Posté le 08-12-2006 à 17:20:09  profilanswer
 

n°1489501
MagicBuzz
Posté le 11-12-2006 à 12:53:29  profilanswer
 

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

n°1489504
polo021
Posté le 11-12-2006 à 12:54:54  profilanswer
 

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

n°1489542
MagicBuzz
Posté le 11-12-2006 à 14:10:19  profilanswer
 

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

n°1489635
Kilyn
Milé sek milé
Posté le 11-12-2006 à 16:03:59  profilanswer
 

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.
n°1489672
MagicBuzz
Posté le 11-12-2006 à 16:47:32  profilanswer
 

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.

n°1489829
polo021
Posté le 11-12-2006 à 20:37:57  profilanswer
 

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

n°1491474
Kilyn
Milé sek milé
Posté le 14-12-2006 à 17:29:50  profilanswer
 

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.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
[RESOLU] Recherche de quoi debugger du JS sous IE6Différence borders dans browsers - résolu
[Résolu] JDBC Taille memoire des resultsetdétection javascript on [résolu]
[RESOLU] [AJAX] probleme d'envoi d'un "+" par POST[Résolu] FPDF et image (de mauvaise qualité)
[RESOLU]Erreur SQL : ORA-01008: Toutes les variables ne sont pas liées[PHP/MySQL] [RESOLU] GRANT, Problèmes de droits
[Résolu] Vérification en javascript d'un tableau dynamique en PHPafficher une nouvelle page
Plus de sujets relatifs à : [Résolu] Générer une nouvelle clé


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR