Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/01/2012, 11h35   #1
Membre habitué
 
Avatar de Dark Ryus
 
Développeur informatique
Inscription : avril 2007
Messages : 275
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 275
Points : 112
Points : 112
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 :
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
Dark Ryus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h50   #2
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 987
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 987
Points : 1 700
Points : 1 700
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.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h56   #3
Membre habitué
 
Avatar de Dark Ryus
 
Développeur informatique
Inscription : avril 2007
Messages : 275
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 275
Points : 112
Points : 112
Pour retourner une seule colonne, j'ai compris le truc, enfin je crois.

Moi je veux retourner toutes mes colonnes ...

Comment faire ?
Dark Ryus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 11h59   #4
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 987
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

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

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

nom_variable nom_table%ROWTYPE ;
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h10   #5
Membre habitué
 
Avatar de Dark Ryus
 
Développeur informatique
Inscription : avril 2007
Messages : 275
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 275
Points : 112
Points : 112
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 :
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;
Dark Ryus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h17   #6
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 987
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 987
Points : 1 700
Points : 1 700
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.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h20   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
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 :
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>
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 12h27   #8
Membre habitué
 
Avatar de Dark Ryus
 
Développeur informatique
Inscription : avril 2007
Messages : 275
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 275
Points : 112
Points : 112
Vous ne connaissez pas un bout de code en VB qui fait ça par hasard ? ^^

Je vais chercher.
Dark Ryus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 13h21   #9
Membre Expert
 
Inscription : août 2008
Messages : 1 274
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 274
Points : 1 934
Points : 1 934
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)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 13h45   #10
Membre habitué
 
Avatar de Dark Ryus
 
Développeur informatique
Inscription : avril 2007
Messages : 275
Détails du profil
Informations personnelles :
Âge : 25
Localisation : France, Meurthe et Moselle (Lorraine)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : avril 2007
Messages : 275
Points : 112
Points : 112
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 !
Dark Ryus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h26.


 
 
 
 
Partenaires

Hébergement Web