Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/02/2011, 12h46   #1
Futur Membre du Club
 
Inscription : janvier 2011
Messages : 45
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 45
Points : 15
Points : 15
Par défaut UPDATE IN CURSOR

Bonjour à tous, je ne comprends pas pourquoi le curseur ci-dessous ne réalise pas les UPDATE nécessaires sur les produits de numéro 4...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DECLARE @quant varchar(180); 
DECLARE qua cursor FOR SELECT Qtecom FROM LIGNE WHERE Noprod = 4; 
OPEN qua; 
FETCH NEXT FROM qua INTO @quant;   
WHILE @@FETCH_STATUS = 0 
BEGIN    
	IF (@quant < 20) 
        BEGIN   
		UPDATE LIGNE SET @quant = @quant + 10
		FETCH NEXT FROM qua INTO @quant
        END
	IF (@quant >= 20)    
		UPDATE LIGNE SET @quant = @quant - 5
		FETCH NEXT FROM qua INTO @quant 
END;   
CLOSE qua;
DEALLOCATE qua;
Je souhaiterais que le curseur parcoure tous les tuples et pour les produits de numéro 4 ajoute 10 à la quantité si la quantité est < à 20 et soustrait 5 si la quantité est >= à 20.


Merci beaucoup !
Aiglon13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2011, 15h36   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 769
Points : 17 769
Pour mettre à jour dans un curseur, il faut utiliser un update avec position de ligne : CURRENT OF

Extrait de mon livre sur SQL :

***

7.3.2 mises à jour à travers un curseur

Les données retournées par un curseur peuvent être mise à jour (INSERT, DELETE et UPDATE). Pour ce faire, il faut déclarer le curseur FOR UPDATE et éventuellement renseigner la liste des colonnes visée par la mise à jour. Dans le cas du DELETE et du UPDATE, pour que l'ordre de mise à jour porte sur la ligne courante ou le curseur est positionné, il faut utiliser dans la clause WHERE, l’expression CURRENT OF <nom_curseur>.

Exemples :

Code :
1
2
3
UPDATE T_UTILISATEUR_USR
SET    USR_NOM = LOWER(USR_NOM)
WHERE  CURRENT OF C_USER
Modifiera en minuscule le nom de l'utilisateur sur lequel le curseur C_USER est positionné. Le nom de la table n'est pas obligatoire.

Code :
1
2
DELETE 
WHERE  CURRENT OF C_USER
Supprime la ligne courante de la table sur laquelle le curseur C_USER est positionné. Il n'est pas nécessaire de préciser le nom de la table. Le curseur se positionne sur la ligne précédente.

Code :
1
2
INSERT INTO C_USER
VALUES (29, 'stanley.kubrick@aol.com, 'M.', 'KUBRICK', 'Stanley', NULL)
Insère une nouvelle ligne dans la table sous jacente au curseur. La ligne courante devient la ligne insérée.

***

En sus point besoin d'un curseur qui est lent et non optimisable pour faire cette requête :

Code :
1
2
3
4
5
6
UPDATE LIGNE
SET    Qtecom = Qtecom + CASE 
                            WHEN Qtecom < 20  THEN 10
                            WHEN Qtecom >= 20 THEN -5
                         END
WHERE  Noprod = 4;
Bref, apprenez le langage SQL. mon site web comme mon bouquin peuvent vous y aider !


A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h11.


 
 
 
 
Partenaires

Hébergement Web