Bonsoir,
J'ai trouvé aujourd'hui une petite astuce bien utile que je vous livre ici.
Le problème était le suivant :
J'avais une table LZHISTOPRIXART contenant plusieurs milliers d'enregistrements, mais dans laquelle je n'avais pas de clé primaire. J'ai donc décidé d'ajouter un champ ID_LIGNE qui allait remplir cette fonction.
Malheureusement c'était impossible car après la création de mon champ, toutes les lignes avaient l'ID 1 !!! (et pas null car j'avais créé un champ NON NULL). Je devais donc trouver un moyen de remplir ce champ avec les valeurs 1, 2, 3, 4, ... pour tous les enregistrements de la table.
Je comptais faire une boucle dans laquelle j'aurais fait ceci :
Seulement voilà, que mettre comme clause dans le WHERE ??? N'ayant pas de clé primaire, et certaines valeurs apparaissant en double, je n'avais aucun moyen d'identifier chaque enregistrement de manière unique.
Code : Sélectionner tout - Visualiser dans une fenêtre à part UPDATE lzhistoprixart SET id_ligne = ... WHERE ... ;
C'est alors que j'ai repensé aux Curseurs. Je me suis documenté et j'ai finalement écrit cette procédure :
La partie importante commence dans la boucle FOR SELECT dans laquelle je déclare que le résultat de mon select sera parcouru par un curseur appelé "liste". Le seul point obscur est l'utilisation de INTO :a qui me semble ne servir à rien (mais qui est cependant nécessaire...). Donc la première partie se résume à FOR SELECT ... AS CURSOR NomCurseur DO BEGIN ... END
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 SET TERM ^ ; CREATE OR ALTER PROCEDURE renum AS DECLARE VARIABLE a INTEGER; DECLARE VARIABLE new_id INTEGER; BEGIN new_id = 1; FOR SELECT id_ligne FROM lzhistoprixart INTO :a AS CURSOR liste DO BEGIN UPDATE lzhistoprixart SET id_ligne = :new_id WHERE CURRENT OF liste; new_id = new_id + 1; END END^ SET TERM ; ^
Ensuite, l'autre partie importante se trouve dans l'UPDATE, pour lequel le seul critère de la clause WHERE est CURRENT OF NomCurseur. Ainsi, le résultat de mon select est parcouru par le curseur "liste" que j'utilise à chaque exécution de l'update, afin de modifier uniquement l'enregistrement en cours.
Victoire ça fonctionne, j'ai les valeurs 1, 2, 3, 4, 5, ... jusqu'à la fin de ma table
Partager