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) FIN (après update)
0000000000000000001 0000000000000000999 0000000000000002000 (0000000000000002001 - 1)
0000000000000002001 0000000000000040999 0000000000000040999 (ligne inchangée 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
- UPDATE rang SET A fin = (SELECT to_char(to_number(LEAD(A.deb,1) OVER (ORDER BY B.deb , B.fin) - 1 )) from rang B where A.deb = B.deb ) where A.deb in ( '0000000000000000001' , '0000000000000002001 ' ) ;
équivalemment à
UPDATE rang SET A fin = (SELECT to_char(to_number(LEAD(B.deb,1) OVER (ORDER BY B.deb , B.fin) - 1 )) from rang B where A.deb = B.deb ) where A.deb in ( '0000000000000000001' , '0000000000000002001 ' ) ;
=> update réalisés avec fin toujours à 'null' au lieu de la valeur calculée dans le LEAD.
Avez vous une idée pour réussir mon update avec une autre commande que LEAD ou une meilleure utilisation ?
Par avance, merci