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 :

[SQL Server] Problème avec un curseur ?


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 55
    Points : 43
    Points
    43
    Par défaut [SQL Server] Problème avec un curseur ?
    Bonjour,

    J'ai un problème avec un curseur que j'ai déclaré. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE cElements SCROLL CURSOR 
    FOR 
    	Select * from #Temp_Elements;
     
    	--Ouverture du curseur
    	Open cElements;
    print 'Open'
     
    print 'AvantFetch'
    	--Obtient le premier enregistrement
    	FETCH FIRST From cElements INTO @No_element, @Tps_elem;
    print 'Fetch'
    Je reçois comme erreur : Cursor is not open, tout de suite après que j'aie écrit dans la console 'AvantFetch'. Plus précisément, le résultat est le suivant :
    Open
    AvantFetch
    Msg 16917, Level 16, State 1, Procedure EqCandidatPlusGrand, Line 186
    Cursor is not open.
    Je n'arrive pas à comprendre pourquoi cette erreur est présente.

    Merci d'avance,

    Évans

  2. #2
    Invité(e)
    Invité(e)
    Par défaut Re: [SQL Server] Problème avec un curseur ?
    Citation Envoyé par evans
    Bonjour,

    J'ai un problème avec un curseur que j'ai déclaré. Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE cElements SCROLL CURSOR 
    FOR 
    	Select * from #Temp_Elements;
     
    	--Ouverture du curseur
    	Open cElements;
    print 'Open'
     
    print 'AvantFetch'
    	--Obtient le premier enregistrement
    	FETCH FIRST From cElements INTO @No_element, @Tps_elem;
    print 'Fetch'
    Je reçois comme erreur : Cursor is not open, tout de suite après que j'aie écrit dans la console 'AvantFetch'. Plus précisément, le résultat est le suivant :
    Open
    AvantFetch
    Msg 16917, Level 16, State 1, Procedure EqCandidatPlusGrand, Line 186
    Cursor is not open.
    Je n'arrive pas à comprendre pourquoi cette erreur est présente.

    Merci d'avance,

    Évans


    DECLARE cElements SCROLL CURSOR
    FOR
    Select No_element,Tps_elem from #Temp_Elements;

    --Ouverture du curseur
    Open cElements;
    print 'Open'

    print 'AvantFetch'
    --Obtient le premier enregistrement
    FETCH cElements INTO @No_element, @Tps_elem;
    print 'Fetch'

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    Il reproduit la même erreur. Je trouve ça étrange ...
    C'est comme si le Open ne se faisait pas, y aurait-il une propriété à ajouter au Open si c'est un curseur SCROLL ?

    Merci,

    Évans

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par evans
    Bonjour,

    Il reproduit la même erreur. Je trouve ça étrange ...
    C'est comme si le Open ne se faisait pas, y aurait-il une propriété à ajouter au Open si c'est un curseur SCROLL ?

    Merci,

    Évans
    peut-etre n'as tu pas de donnees , faut voir le num d'erreur !!

    Exemple Oracle
    DECLARE
    employe_nom employe.eNom%TYPE;
    salaire employe.eSalaire%TYPE;
    CURSOR curseur1 (nom VARCHAR2, sal NUMBER)
    IS SELECT e.eNum, e.eNom, e.ePoste, r.eSalaire
    FROM employe AS e, remuneration AS r
    WHERE e.eNom = nom AND r.eSalaire = sal;
    BEGIN
    OPEN curseur1('DUPONT', 3000);
    LOOP
    FETCH curseur1 INTO @employe, @salaire;
    EXIT WHEN curseur1%NOTFOUND;
    END LOOP;
    END;
    ...

    -- Exemple SQL Server
    DECLARE @employe_nom VARCHAR(11), @numero INT, @salaire INT

    DECLARE curseur1 CURSOR
    FOR SELECT eNum, eNom FROM employe

    OPEN curseur1

    FETCH curseur1 INTO @numero, @employe_nom
    WHILE @@FETCH_STATUS = 0
    BEGIN
    FETCH curseur1 INTO @numero, @employe_nom
    DECLARE curseur2 CURSOR
    FOR SELECT eSalaire, eNom FROM remuneration
    WHERE eNum = @numero

    OPEN curseur2
    FETCH NEXT FROM curseur2 INTO @salaire
    WHILE @@FETCH_STATUS = 0
    BEGIN
    PRINT @numero + ' ' + @employe_nom + ' ' + @salaire
    FETCH NEXT FROM curseur2 INTO @salaire
    END
    END
    ...Un curseur s'ouvre par l'intermédiaire de la commande OPEN suivi du nom du curseur et de ses éventuels arguments.

    OPEN nom_curseur[(liste_arguments...)];La commande FETCH permet de parcourir un enregistrement du curseur ouvert. L'ensemble des enregistrements d'un curseur peut être parcouru à l'aide d'une structure itérative.

    -- Exemple Oracle
    LOOP
    FETCH CurseurEmploye INTO sal;
    EXIT WHEN nom_curseur%NOTFOUND;
    i = i + 1;
    END LOOP;

    -- Exemple SQL Server
    FETCH NEXT FROM nom_curseur
    WHILE @@FETCH_STATUS = 0
    BEGIN
    FETCH NEXT FROM nom_curseur;
    ENDLa fonction SQLServer @@FETCH_STATUS retourne l'état de la dernière instruction FETCH appliquée au curseur en cours d'utilisation. Les valeurs 0, -1 et -2 indiquent respectvement si l'instruction FETCH a réussi ou a échouée et si la ligne recherchée n'a pas été trouvée.

    L'attribut Oracle %NOTFOUND retourne FALSE si la dernière instruction FETCH renvoie un enregistrement ou TRUE en cas d'échec.

    Suite à la fin de son utilisation, le curseur peut être fermé afin de ne plus consommer de ressources. Il est également possible de désallouer le curseur.

    CLOSE nom_curseur;

    -- Exemple SQL Server
    DESALLOCATE nom_curseur;
    -- Exemple Oracle
    DESALLOCATE CURSOR nom_curseur;Exemples
    -- Exemple Oracle
    DECLARE
    sal employe.eSalaire%TYPE;
    i INTEGER := 0;
    CURSOR CurseurEmploye
    IS SELECT eNum, eNom, ePoste, eSalaire FROM employe
    WHERE eSalaire > 1600;
    BEGIN
    OPEN CurseurEmploye;
    LOOP
    FETCH CurseurEmploye INTO sal;
    EXIT WHEN CurseurEmploye%NOTFOUND;
    i = i + 1;
    END LOOP;

    CLOSE CurseurEmploye;
    DEALLOCATE CURSOR CurseurEmploye;
    END;

    -- Exemple SQL Server
    DECLARE CURSOR CurseurEmploye FOR
    SELECT eNum, eNom, ePoste, eSalaire FROM employe
    WHERE eSalaire > 1600;
    BEGIN
    OPEN CurseurEmploye;
    END

    FETCH NEXT FROM CurseurEmploye
    WHILE @@FETCH_STATUS = 0
    BEGIN
    FETCH NEXT FROM CurseurEmploye;
    END

    CLOSE CurseurEmploye;
    DEALLOCATE CurseurEmploye;
    /ACCUEILCOURSSERVICESPLANRECHERCHEANNUAIREFORUMSCONTACTAIDE

  5. #5
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 55
    Points : 43
    Points
    43
    Par défaut
    Bonjour,

    J'ai des données dans ma table, j'effectue même un SELECT avant d'ouvrir le curseur pour être sûr qu'il y a bien des données.
    Cependant, le numéro de l'erreur est le suivant : 16924

    Désolé pour cet oubli, je vais effectuer une recheche sur ce numéro d'erreur.

    Voilà, c'est parce que le nombre de paramètres est supérieur aux variables que je lui affecte dans le INTO.

    Merci,

    Évans

  6. #6
    Invité(e)
    Invité(e)
    Par défaut REPONSE
    BOGUE : Violation d'accès pilote ODBC SQL Server lorsqu' insérer d'un SP distant
    Voir les produits auxquels s'applique cet article
    TRADUCTION AUTOMATIQUE : Cet article technique a été traduit par un système automatique, c'est-à-dire sans aucune intervention humaine. Microsoft propose ce type d’articles en complément de ceux traduits par des traducteurs professionnels. Ces articles sont destinés principalement aux utilisateurs ne comprenant pas l'anglais en leur proposant, en complément, une version française de l’information technique fournie dans la version américaine et originale de l’article. Pour plus de détails, veuillez consulter la page http://support.microsoft.com/gp/mtdetails. Attention : Il est possible que certaines parties de l’article ne soient pas traduites par le système automatique et qu’elles soient restées rédigées en anglais. Microsoft ne garantit pas la qualité linguistique des traductions et ne peut être tenu responsable d’aucun problème, direct ou indirect, dû à une quelconque erreur de traduction du contenu ou de son utilisation par les utilisateurs.
    Numéro d'article : 169468
    Dernière mise à jour : vendredi 27 juillet 2001
    Version : 1.0
    BOGUE # : 16924 (SQL)
    Symptômes
    Le pilote ODBC SQL Server peut générer une erreur de violation d'accès (AV) si une application insère des données de procédures stockées distantes qui contiennent la clause ORDER BY. La violation d'accès se produit lorsque l'application appelle SQLExecDirect ou SQLPrepare/SQLExecute pour exécuter l'instruction INSERT.
    Statut
    Microsoft a confirmé l'existence d'un problème dans le Microsoft SQL Server version de pilote 2.65. Nous recherchons ce problème et publierons l'information nouvelle ici nous dans la Base de connaissances Microsoft dès qu'il est disponible.
    Contournement
    Pour contourner ce problème, supprimez des procédures stockées distantes la clause ORDER BY.

    --------------------------------------------------------------------------------

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

Discussions similaires

  1. Problème connexion Cube SQL SERVER 2005 avec EXCEL
    Par nnasser dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 22/09/2006, 15h23
  2. Réponses: 5
    Dernier message: 14/06/2006, 12h21
  3. [SQL Server]Problème avec une requête récursive
    Par evans dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/04/2006, 20h16
  4. Problème avec les curseurs SQL SERVER
    Par stefostillrise dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 11/11/2005, 13h09
  5. [SQL Server]Problème avec l'authentification SQL SERVER
    Par tidou dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/04/2005, 15h40

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