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 :

Cursor & Insert


Sujet :

MS SQL Server

  1. #1
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut Cursor & Insert
    Bonjour,

    j'ai un piti soucis,

    j'ai un cursor qui fait:

    pour tout les lignes étape1
    faire update ligne = étape2
    faire insert new ligne = étape1


    donc en gros, j'ajoute des lignes qui remplissent la condition de mon cursor dans ma table et donc forcément ça boucle à l'infini...

    Y a un truc pour dire au cursor qu'il doit prendre un snapshot de la table ?

    ou j'ai rien compris ?

    merci

  2. #2
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Merci de donner des exemples et les descriptions des tables et du code SQL.

    En règle général il faut éviter les curseurs.
    D'autre part le curseur ne s'exécute qu'une seule fois puis il est parcouru.
    Donc le souci c'est plutôt une boucle infinie.

  3. #3
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut
    Merci de répondre si rapidement.

    C'est un peu dure de donner des exemples de table...

    Une chose est sur, la requete de mon cursor renvoit 3 lignes.

    Ds mon curseur, j'ai un update et un insert. Si je commente la ligne d'insert ça roule.

    donc je ne pense pas à une boucle infinie...

    Je vais regarder quelle partie du code sql je peux mettre sans reveler des secrets de fabication...

  4. #4
    Inscrit Avatar de bilb0t
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    378
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 378
    Points : 283
    Points
    283
    Par défaut
    La table COUPLES_CADRE_CHEF contient les champs suivants
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    refCadre INT, refChef INT
    La table global_chefs contient les champs suivants:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    id INT, refCadre INT, refChef INT, dateDebut DATETIME, dateFin DATETIME, manual BIT
    Elle représente un couple de cadre/chef pendant une période (dateDebut,dateFin). Ce couple peut venir de la table COUPLES_CADRE_CHEF ou être modifié manuellement.

    Comme je viens d'hériter de l'applic, je ne peux rien changer au niveau du code ou de la structure DB. Mais il se fait que la sync ne fonctionne pas bien. Ds un premier tmp, je compte resync les datas et ensuite je verrai pq ça déconne.

    donc pour resync, je fais ceci:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    declare @ref_cadre integer
    declare @old_chef integer
    declare @new_chef integer
     
    declare curs cursor 
    for select GC.refCadre,GC.refChef,ccc.chef
    from global_chefs GC
    inner join COUPLES_CADRE_CHEF ccc on  ccc.cadre = GC.RefCadre 
     and ccc.chef <> GC.RefChef
     and manual = 0
     where DateFin is null
     
    open curs
    fetch next from curs into @ref_cadre, @old_chef,@new_chef
     
    while(@@FETCH_STATUS = 0)
    BEGIN
    /*On cloture l'ancien couple*/
    update global_chefs set dateFin=GETDATE(), Manual=0 where refCadre=@ref_cadre and refChef=@old_chef and dateFin is null
    /*On crée le nouveau*/
    insert into global_chefs(RefCadre,RefChef,DateDebut,DateFin, Manual)
    values (@ref_Cadre,@new_chef,GETDATE(),null,0)
     
     fetch next from curs into @ref_cadre, @old_chef,@new_chef
    END
     
    close curs
    deallocate curs

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour,

    essayez d'ajouter la clause INSENSITIVE dans le DECLARE pour faire en sorte
    d'avoir une copie des données dans une table temporaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    declare curs insensitive cursor
    Emmanuel T.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CURSOR FOR et INSERT INTO SELECT
    Par TomDuBouchon dans le forum PL/SQL
    Réponses: 8
    Dernier message: 25/10/2010, 15h36
  2. cursor + truncate +insert
    Par karimoos dans le forum PL/SQL
    Réponses: 7
    Dernier message: 05/05/2010, 13h31
  3. probleme d'insertion d'un Float
    Par neness dans le forum Débuter
    Réponses: 3
    Dernier message: 07/01/2003, 12h32
  4. [Postgresql] pb lors d'insertion de données
    Par bob20000 dans le forum Requêtes
    Réponses: 8
    Dernier message: 04/11/2002, 15h33
  5. Réponses: 4
    Dernier message: 28/09/2002, 00h00

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