IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

UPDATE IN CURSOR


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2011
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 50
    Points : 38
    Points
    38
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 +

Discussions similaires

  1. Les Cursor d'update
    Par adil_vpb dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 05/09/2006, 16h11
  2. Accès concurrent sur un cursor "For update"
    Par atruong dans le forum Oracle
    Réponses: 7
    Dernier message: 04/05/2006, 22h47
  3. pb PL/SQL ORA-01410 cursor for update & current of
    Par carlitoB dans le forum PL/SQL
    Réponses: 2
    Dernier message: 14/04/2006, 14h59
  4. [ASE] Les locks avec un cursor for update
    Par PiyuXYZ dans le forum Sybase
    Réponses: 1
    Dernier message: 11/02/2006, 13h17
  5. CURSOR FOR UPDATE
    Par GoLDoZ dans le forum Oracle
    Réponses: 6
    Dernier message: 15/11/2005, 15h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo