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

PL/SQL Oracle Discussion :

Close SYS_REFCURSOR dans une procédure


Sujet :

PL/SQL Oracle

  1. #1
    Membre éclairé Avatar de Dark Ryus
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 333
    Par défaut Close SYS_REFCURSOR dans une procédure
    Bonjour,

    j'ai un petit souci de nombre de curseur ouvert dépassé.

    Voici ma procédure stockée :
    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 "PAR_SER_PRIX_SELECT_ABONNEMENT" 
    (
      idtService IN NUMBER 
    , idPack IN NUMBER 
    , codeClient IN VARCHAR2  
    , idtEntite IN NUMBER  
    , nbAchat IN NUMBER 
    , curseur OUT SYS_REFCURSOR
    ) AS 
     
    BEGIN
     
      OPEN curseur FOR
      SELECT *
      FROM PAR_SER_PRIX 
      WHERE SPX_IDTSPX = GET_TARIF(idtService, idPack, codeClient, idtEntite, nbAchat);
     
    END PAR_SER_PRIX_SELECT_ABONNEMENT;
    Comment faire pour fermer le curseur ?

    Si je fait un close après ma requête, mon résultat devient vide ....

    Merci d'avance

  2. #2
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Bonjour,

    Ta syntaxe n'est pas exacte, ce tuto pourra te montrer la bonne écriture.

    Tu dois enregistrer tes données dans une variable. Puis fermer ton curseur.

  3. #3
    Membre éclairé Avatar de Dark Ryus
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 333
    Par défaut
    Pour retourner une seule colonne, j'ai compris le truc, enfin je crois.

    Moi je veux retourner toutes mes colonnes ...

    Comment faire ?

  4. #4
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Il existe le type %ROWTYPE qui te permet de récupérer toutes les colonnes d'une table, ce tuto montre son utilisation.

    %ROWTYPE
    référence à une ligne d'une table ou d'un curseur

    nom_variable nom_table%ROWTYPE ;

  5. #5
    Membre éclairé Avatar de Dark Ryus
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 333
    Par défaut
    Et du coup je met quoi dans les paramètres de ma procédure sockée ? Car j'ai besoin du retour.

    Je viens de faire ça mais j'ai besoin de retourner les données :
    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
     
    create or replace
    PROCEDURE "PAR_SER_PRIX_SELECT_ABONNEMENT" 
    (
      idtService IN NUMBER 
    , idPack IN NUMBER 
    , codeClient IN VARCHAR2  
    , idtEntite IN NUMBER  
    , nbAchat IN NUMBER 
    , curseur OUT SYS_REFCURSOR
    ) AS 
      CURSOR C_EMP(idtService NUMBER, idPack NUMBER, codeClient VARCHAR2, idtEntite NUMBER, nbAchat NUMBER) IS
      SELECT *
      FROM PAR_SER_PRIX 
      WHERE SPX_IDTSPX = GET_TARIF(idtService, idPack, codeClient, idtEntite, nbAchat);
       LR$C_emp C_EMP%ROWTYPE ;
    BEGIN
     
      OPEN C_EMP(idtService, idPack, codeClient, idtEntite, nbAchat);
      FETCH C_EMP Into LR$C_emp;
      CLOSE C_EMP;
     
    END PAR_SER_PRIX_SELECT_ABONNEMENT;

  6. #6
    Membre Expert Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 38
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Par défaut
    Dans ce cas il vaut mieux pour toi de faire une fonction.

    A l'aide de l'instruction RETURN tu pourras retourner tes valeurs.

    Ou alors afficher les données avec un DBMS_OUTPUT.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Son code est correcte (mise à part l'emploi d'un select * ce qui n'est pas très pro pour de la prod).
    C'est au programme appelant de close le curseur, par exemple pour sqlplus, print fetch les lignes et close le curseur :
    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    SQL> create or replace procedure p (c out sys_refcursor) as
      2  begin
      3    open c for select * from dual;
      4  end;
      5  /
     
    Procedure created.
     
    SQL>
    SQL> var r refcursor;
    SQL>
    SQL> exec p(:r);
     
    PL/SQL procedure successfully completed.
     
    SQL>
    SQL> select a.value, s.username, s.sid, s.serial#
      2  from v$sesstat a, v$statname b, v$session s
      3  where a.statistic# = b.statistic#  and s.sid=a.sid
      4  and b.name = 'opened cursors current'
      5  and s.username = 'SKUATAMAD';
     
         VALUE USERNAME                              SID    SERIAL#
    ---------- ------------------------------ ---------- ----------
             2 SKUATAMAD                             101         11
     
    SQL>
    SQL> print :r
     
    D
    -
    X
     
    SQL>
    SQL> select a.value, s.username, s.sid, s.serial#
      2  from v$sesstat a, v$statname b, v$session s
      3  where a.statistic# = b.statistic#  and s.sid=a.sid
      4  and b.name = 'opened cursors current'
      5  and s.username = 'SKUATAMAD';
     
         VALUE USERNAME                              SID    SERIAL#
    ---------- ------------------------------ ---------- ----------
             1 SKUATAMAD                             101         11
     
    SQL>
    SQL> print :r
    SP2-0625: Error printing variable "r"
    SQL>
    SQL> exec p(:r);
     
    PL/SQL procedure successfully completed.
     
    SQL>
    SQL> select a.value, s.username, s.sid, s.serial#
      2  from v$sesstat a, v$statname b, v$session s
      3  where a.statistic# = b.statistic#  and s.sid=a.sid
      4  and b.name = 'opened cursors current'
      5  and s.username = 'SKUATAMAD';
     
         VALUE USERNAME                              SID    SERIAL#
    ---------- ------------------------------ ---------- ----------
             2 SKUATAMAD                             101         11
     
    SQL>

  8. #8
    Membre éclairé Avatar de Dark Ryus
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 333
    Par défaut
    Vous ne connaissez pas un bout de code en VB qui fait ça par hasard ? ^^

    Je vais chercher.

  9. #9
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Moi non, mais internet doit pouvoir aider, sûrement une méthode close.
    Au cas où ça colle avec l'environnement :
    Extraction de données à l'aide d'un DataReader (ADO.NET)

  10. #10
    Membre éclairé Avatar de Dark Ryus
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    333
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 333
    Par défaut
    Veuillez me pardonner, mais un mauvais copier-coller ma fait zapper mon ' myReader.Close()' en VB qu j'utilise dans mes autres fonctions....

    Merci skuatamad, ça m'a permis de le voir...

    Tout ça pour rien lol !

    Merci !

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

Discussions similaires

  1. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  2. Vérification du type de données dans une procédure stockée
    Par biroule dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 16/09/2004, 11h20
  3. Marquer une pause dans une procédure stockée
    Par PéPénet dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 08/11/2003, 10h42
  4. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 11h31
  5. Fin de programme dans une procédure
    Par Sinclair dans le forum Langage
    Réponses: 13
    Dernier message: 29/11/2002, 22h30

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