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 :
UPDATE lzhistoprixart SET id_ligne = ... WHERE ... ;
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.
C'est alors que j'ai repensé aux Curseurs. Je me suis documenté et j'ai finalement écrit cette procédure :
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 ; ^ |
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
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