UPDATE sql avec calcul de la valeur à modifier [Fermé]

Signaler
-
Messages postés
32197
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 juin 2021
-
Bonjour,

Je souhaite dans une table Oracle, modifier une valeur, en la calculant de la ligne suivante afin d'éviter les ruptures.
Cette table contient une zone DEB qui contient la valeur de début et une zone FIN qui contient la valeur de fin de la série.
Nous ne devons pas avoir de vide dans notre série, de ce fait je dois modifier la valeur fin avec la valeur DEB -1 de la ligne suivante.

J'ai essayé la commande LEAD, mais celle ci fonctionne très bien avec un sélect mais ne fonctionne pas avec un update.
Ma table fait plusieurs milliers de lignes
Table RANG de n colonnes avec 2 colonnes DEB et FIN, il n'y pas de doublon dans ces items.

SELECT deb , fin , to_char(to_number(LEAD(deb,1) OVER (ORDER BY deb , fin) - 1 )) NVX_FIN 
FROM rang ;

DEB (CHAR) FIN (CHAR) NVX_FIN (résultat désiré après update)
0000000000000000001 0000000000000000999 0000000000000002000 (0000000000000002001 - 1)
0000000000000002001 0000000000000040999 0000000000000040999 (0000000000000041000 - 1)
0000000000000041000 0000000000000049999 0000000000000069999 (0000000000000070000 - 1)
0000000000000070000 0000000000000999999 0000000000000999999 dernière ligne donc inchangée

j'ai essayé
UPDATE rang SET fin = to_char(to_number(LEAD(deb,1) OVER (ORDER BY deb , fin) - 1 )) 
where fin < MAX(fin) ;

ERROR ORA-30483: window functions are not allowed here

UPDATE rang SET fin = cast(lead(deb,1) over (order by deb , fin) as decimal)+1 where rownum < 4 ;

ERROR ORA-30483: window functions are not allowed here

UPDATE rang SET fin = (lead(deb,1) over (order by deb , fin) +1) where rownum < 4 ;

ERROR ORA-30483: window functions are not allowed here

Avez vous une idée pour réussir mon update avec une autre commande que LEAD ou une meilleure utilisation de cette commande ?

Par avance, merci

1 réponse

Messages postés
32197
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 juin 2021
7 753
Bonjour,

Il faut effectuer un select pour trouver la valeur à affecter. Quelque chose comme

update rang A set fin = (select to_char(to_number(LEAD(deb,1) OVER (ORDER BY deb , fin) - 1)) from rang B where b.deb = a.deb  )
where rownum < 4 


Bonjour,

Merci @jee pee

Je viens d'essayer, et par contre, je récupère toujours 'null' dans le select, la fonction LEAD sur un select unique (dans l'ordre UPDATE) ne fonctionne pas.
Avons nous une autre fonction pour récupérer dans un select unique, une valeur de la ligne suivante de la table (non récupéré dans le select) ?
Messages postés
32197
Date d'inscription
mercredi 2 mai 2007
Statut
Modérateur
Dernière intervention
18 juin 2021
7 753 > reglm
et un
select min(b.deb) - 1 from rang b where b.deb > a.deb