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

SQL Oracle Discussion :

Procédure qui renvoit plusieurs lignes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut Procédure qui renvoit plusieurs lignes
    Bonjour à tous,

    Je cherche à créer une procédure qui me renvoit le contenu d'un select. Le contenu peut être nul, une ligne ou plusieurs lignes. Cette procédure reçoit un id et puis retourne le contenu du select en plus des variables de message d'échec ou de réussite. J'utilise Oracle 10g R2.

    Voici la procédure,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PROCEDURE comm_op_range(
                                            vi_op_id         IN NUMBER,
                                            vo_cur           OUT sys_refcursor,
                                            vo_ok            OUT NUMBER,
                                            vo_error_num  OUT NUMBER,
                                            vo_error_msg  OUT VARCHAR2)
    IS
     
    sel_comm_error  EXCEPTION;
     
    BEGIN
    OPEN vo_cur FOR
    SELECT * FROM TABLE
    WHERE TABLE.ID = vi_op_id
    Donc le retour du select est renvoyé au programme appelant. Mais ici, si j'ai bien compris on ne peut pas retourner un curseur null. Alors l'utilisateur reçoit le message ORA-01001 Invalid cursor. J'aimerais pouvoir gérer tout les cas et ainsi si c'est nul retourner à la variable vo_error_msg "Invalid ID" par exemple.

    Merci.

  2. #2
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    ton exemple n'est pas clair...

    1) soit tu retournes un curseur sur 0 ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    create table lsc_t(x number);
    create PROCEDURE lsc_p(vi_op_id IN NUMBER, vo_cur OUT sys_refcursor)
    IS BEGIN
    OPEN vo_cur FOR SELECT * FROM lsc_tWHERE x = vi_op_id;
    END;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> var c refcursor;
    SQL> exec lsc_p(1,:c);
     
    PL/SQL procedure successfully completed.
     
    SQL> print
     
    no rows selected
    2) tu retournes null
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace PROCEDURE lsc_p(vi_op_id IN NUMBER, vo_cur OUT sys_refcursor)
    IS BEGIN
      vo_cur := null;
    END;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SQL> var c refcursor;
    SQL> exec lsc_p(1,:c);
     
    PL/SQL procedure successfully completed.
    Alors où est le ORA-01001 Invalid cursor?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Vous avez raison il n'y pas de problème particulier avec la procédure en elle-même mais plutôt avec les tests générés avec SQL Developper. Je tente toutes les valeurs possibles pour le paramètre d'entré vo_op_id. Mais lorsque j'utilise une valeur inexistante dans la table du curseur VO_CUR en utilisant le 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    DECLARE
      VI_OP_ID NUMBER;
      VO_CUR SYS_REFCURSOR;
      VO_OK NUMBER;
      VO_ERROR_NUM NUMBER;
      VO_ERROR_MSG VARCHAR2(200);
      VO_RANGE_BEG number;
      VO_RANGE_END NUMBER;
      VO_COMM      VARCHAR2(200);
      VO_OP_IST    VARCHAR2(3);
      VO_BLOCKED   VARCHAR2(1);
     
    BEGIN
      VI_OP_ID := 130000;
     
      PKG_REF_SELECT.COMM_OP_RANGE(
        VI_OP_ID => VI_OP_ID,
        VO_CUR => VO_CUR,
        VO_OK => VO_OK,
        VO_ERROR_NUM => VO_ERROR_NUM,
        VO_ERROR_MSG => VO_ERROR_MSG
      );
     
      --OPEN VO_CUR; 
      LOOP
      FETCH VO_CUR INTO VO_RANGE_BEG, VO_RANGE_END, VO_BLOCKED, VO_COMM, VO_OP_IST;
      EXIT WHEN VO_CUR%NOTFOUND;
      DBMS_OUTPUT.PUT_LINE('VO_beg = ' || VO_RANGE_BEG);
      DBMS_OUTPUT.PUT_LINE('VO_end = ' || VO_RANGE_END);
      DBMS_OUTPUT.PUT_LINE('VO_com = ' || VO_COMM);
      DBMS_OUTPUT.PUT_LINE('VO_op_ist = ' || VO_OP_IST);
      END LOOP;
      CLOSE VO_CUR;
     
      -- Modify the code to output the variable
      -- DBMS_OUTPUT.PUT_LINE('VO_CUR = ' || VO_CUR);
      DBMS_OUTPUT.PUT_LINE('VO_OK = ' || VO_OK);
      DBMS_OUTPUT.PUT_LINE('VO_ERROR_NUM = ' || VO_ERROR_NUM);
      DBMS_OUTPUT.PUT_LINE('VO_ERROR_MSG = ' || VO_ERROR_MSG);
    END;
    A ce moment précis j'obtiens l'erreur Invalid cursor qui à mon avis doit être lié au bloc fetch puisqu'en enlevant le bloc et en testant avec la même valeur je n'ai plus l'erreur. Dans ce cas, l'utilisateur reçoit un message qui est juste, l'informant que le vo_op_id n'est pas valide. Alors question, est-ce que je peux conserver tout, en ajoutant un bloc conditionnel qui me permettrait de tester à la fois une valeur inexistante et une valeur existante ?

  4. #4
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    exception

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    85
    Détails du profil
    Informations personnelles :
    Âge : 60
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2009
    Messages : 85
    Par défaut
    Merci pour l'info.

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

Discussions similaires

  1. Centrer un caption qui fait plusieurs lignes
    Par stressou dans le forum Mise en forme
    Réponses: 1
    Dernier message: 26/11/2007, 17h20
  2. Réponses: 7
    Dernier message: 17/10/2006, 13h32
  3. Procédure mettre à jour plusieurs lignes
    Par JEFF56 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 29/05/2006, 11h53
  4. Procédure stockée - Retourner plusieurs ligne d'une table
    Par ronando dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/11/2005, 14h19
  5. Réponses: 14
    Dernier message: 09/04/2004, 14h44

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