UPDATE sql avec calcul de la valeur à modifier

Fermé
reglm - Modifié le 22 mars 2019 à 19:18
jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 - 25 mars 2019 à 12:22
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
A voir également:

1 réponse

jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235
Modifié le 22 mars 2019 à 19:37
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 


0
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) ?
0
jee pee Messages postés 39635 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 25 avril 2024 9 235 > reglm
Modifié le 25 mars 2019 à 12:24
et un
select min(b.deb) - 1 from rang b where b.deb > a.deb
0