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

Oracle Discussion :

[Débutant] Utilisation de curseurs


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Par défaut [Débutant] Utilisation de curseurs
    Bonjour ...

    Je travaille sous Oracle 9.i.

    Je suis un peu embetée car je ne comprends pas très très bien comment on utilise les curseurs ... d'après ce que j'ai compris on peut comparer les curseurs Oracle aux recordsets de VBA Access ...

    J'ai regardé le cours qu'il y avait ici :

    http://sheikyerbouti.developpez.com/...=Chap1#L1.2.22

    Mais je ne comprends pas vraiment tout ...

    Voici ce que j'essaie de faire :

    J'ai une requête simple sur une table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TB_PERSONNES WHERE salaire_per > 10000;
    qui me retourne toutes les personnse qui ont un salaire de plus de 10000. Jusque là pas de soucis ... maintenant ce que j'aimerais faire c'est une procédure qui me permette d'utiliser des curseurs pour comprendre leur fonctionnement pour afficher mes données.

    Voici ce que j'ai tenté de faire :

    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
    CREATE OR REPLACE pro_salaire() 
    AS
     
    	DECLARE CURSOR cur_salaire IS SELECT * FROM TB_PERSONNES WHERE salaire_per > 10000;
     
    BEGIN
     
    -- Vérification pour savoir si le curseur est ouvert : 
    	IF NOT cur_salaire%ISOPEN THEN
    		OPEN cur_salaire;
    	END IF;
     
    -- COMMENT PUIS-JE RECUPERER MES VALEURS ???
     
    	CLOSE cur_salaire;
     
    END;
    Mon problème est :
    Comment je peux faire pour parcourir ma table et afficher tous mes enregistrements ???

    Pour parcourir la table je sais que je peux utiliser une boucle FOR -- LOOP ... mais je ne vois absolument pas comment ... si vous avez une ptite idée pour m'aider un ptit peu, cela serait vraiment super ...

    D'ici là, merci à tous ...

  2. #2
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    For cur IN cur_salaire Loop
      -- je suis dans les lignes du curseur
      valeur1 := cur.champ1 ;
      valeur2 := cur.champ2 ;
      ...
    End loop -- je sors du curseur

  3. #3
    Membre éclairé Avatar de Nounoursonne
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 264
    Par défaut
    bonjour,

    ce que tu peux faire c'est par exemple :
    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
     
    CREATE OR REPLACE pro_salaire() 
    AS
     
    	DECLARE CURSOR cur_salaire IS SELECT * FROM TB_PERSONNES WHERE salaire_per > 10000;
     
    BEGIN
     
    -- Vérification pour savoir si le curseur est ouvert : 
    	IF NOT cur_salaire%ISOPEN THEN
    		for r_cur_salaire in cur_salaire loop
                         --affichage des données du curseur
                         dbms_output.put_line(r_cur_salaire.champs1);
                    end loop;
    	END IF;
     
     
     
     
    END;

  4. #4
    Membre éclairé Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Par défaut
    Merci pour vos réponse ... j'ai néanmoins quelques questions ...

    Alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for r_cur_salaire in cur_salaire loop
         --affichage des données du curseur
         dbms_output.put_line(r_cur_salaire.champs1);
    end loop;

    r_cur_salaire : A quoi sert cette variable ??? Et de quel type je dois la déclarer ???
    (r_cur_salaire.champs1) : champs1 correspond au champ numéro 1 de ma table ???

    Ma table est comme suit :

    TB_PERSONNES
    PK_PER --> Cela correspond au champ 1 ?
    NOM_PER --> Cela correspond au champ 2 ?
    PRE_PER --> Cela correspond au champ 3 ?
    SALAIRE_PER --> Cela correspond au champ 4 ?
    GRADE_PER --> Cela correspond au champ 5 ?

    Merci pour vos réponse ... et excusez-moi mais je débute dans le monde d'Oracle ...



    PS : Voici le code que j'ai essayé d'exécuter :

    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
    CREATE OR REPLACE pro_salaire() 
    AS
     
    	DECLARE CURSOR cur_salaire IS SELECT * FROM TB_PERSONNES WHERE salaire_per > 10000;
     
    BEGIN
     
    -- Vérification pour savoir si le curseur est ouvert : 
    	IF NOT cur_salaire%ISOPEN THEN
    		for r_cur_salaire in cur_salaire loop
                         -- Affichage des données du curseur
                         dbms_output.put_line(r_cur_salaire.pk_per);
                    end loop;
    	END IF;
     
    	CLOSE cur_salaire;
     
    END;
    Et voici ce que Oracle me dit :

    DECLARE CURSOR cur_salaire IS SELECT * FROM TB_PERSONNES WHERE salaire_per > 10000;
    *
    ERREUR à la ligne 1 :
    ORA-01001: Curseur non valide
    ORA-06512: à ligne 13
    Si vous avez une petite idée ... elle sera la bienvenue ...

    Merci ...

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pas de DECLARE dans une procédure. C'est implicite entre le AS et le premier BEGIN.

    Sinon r_cur_salaire correspond à l'alias du curseur tu peux mettre r, abcdef, ce que tu veux.
    les colonnes sont ensuite appellées par
    alias.nom_colonne

    exemple r_cur_salaire.PK_PER
    Pas besoin de déclaration.

    Avec les boucles FOR, pas besoin de tester si le curseur est ouvert, il est toujours refermé par Oracle, même si une erreur apparait dans la boucle.

  6. #6
    Membre éclairé Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Par défaut
    merci pour ta réponse McM ...

    Alors voici mon nouveau code :

    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
    CREATE OR REPLACE pro_salaire() 
    AS
     
    	CURSOR cur_salaire IS (SELECT * FROM TB_PERSONNES WHERE (salaire_per > 10000));
     
    BEGIN
     
    	OPEN cur_salaire
     
    	for alias_curseur in cur_salaire loop
    	        -- Affichage des données du curseur
    	        dbms_output.put_line(alias_curseur.pk_per);
            end loop;
     
     
    	CLOSE cur_salaire;
     
    END;
    Et lorsque je l'exécute voici ce que Oracle me dit :

    SP2-0734: commande inconnue au début de "CURSOR cur..." - le reste de la ligne est ignoré.
    for alias_curseur in cur_salaire loop
    *
    ERREUR à la ligne 5 :
    ORA-06550: Ligne 5, colonne 23 :
    PLS-00103: Symbole "CUR_SALAIRE" rencontré à la place d'un des symboles suivants :
    (
    Comment puis-je remédier à cette erreur ???

    Merci de votre aide ...

  7. #7
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 878
    Par défaut
    Hello, mini précision :

    r_cur_salaire est un "enregistrement", qui est par analogie comme une structure en C contenant toutes les colonnes de ta requête; ainsi à chaque passage dans la boucle, cette "structure" est remplie avec les valeurs que ton curseur contient à cet instant et tu peux donc les exploiter dans le LOOP.

    A+

  8. #8
    Membre éclairé Avatar de snoopy69
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    737
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 737
    Par défaut
    Merci de ta réponse KiLVaiDeN mais voici ce que m'a dit McM un peu plus tôt dans la matinée ...

    Citation Envoyé par McM
    Pas de DECLARE dans une procédure. C'est implicite entre le AS et le premier BEGIN.
    Malgré cela, si je mets le déclare, voici le message que j'ai :

    DECLARE CURSOR cur_salaire IS
    *
    ERREUR à la ligne 1 :
    ORA-06511: PL/SQL : curseur déjà ouvert
    ORA-06512: à ligne 2
    ORA-06512: à ligne 9

  9. #9
    Membre Expert Avatar de KiLVaiDeN
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2 878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2 878
    Par défaut
    Ah oui j'ai répondu trop vite !

    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
    CREATE OR REPLACE PROCEDURE pro_salaire 
    IS
     
    	CURSOR cur_salaire IS
    		(SELECT * 
    		FROM TB_PERSONNES WHERE (salaire_per > 10000));
     
    BEGIN
     
    	OPEN cur_salaire;
     
    	for alias_curseur in cur_salaire loop
    	        -- Affichage des données du curseur
    	        dbms_output.put_line(alias_curseur.pk_per);
            end loop;
     
     
    	CLOSE cur_salaire;
     
    END;

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

Discussions similaires

  1. [Débutant] Utilisation du curseur/sablier
    Par michel71 dans le forum Delphi
    Réponses: 2
    Dernier message: 04/03/2007, 15h32
  2. [Débutant]Utilisation de swing
    Par OtI$ dans le forum Débuter
    Réponses: 10
    Dernier message: 01/12/2004, 21h27
  3. [Débutant] Utilisation du mot clé ASSERT
    Par analysiz dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/07/2004, 11h43
  4. [Débutant] Utilisation de FOP - Register Fonts with FOP
    Par Johnbob dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 31/01/2004, 00h27
  5. utilisation de curseur
    Par diunisu06 dans le forum Sybase
    Réponses: 5
    Dernier message: 26/06/2003, 12h08

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