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 31/01/2007, 15h17   #1
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
Par défaut [Oracle 10.2] PL/SQL Paramètre Curseur

Bonjour,

j'aimerais savoir si il est possible d'utiliser un paramètre dans un curseur qui me permettent de mofifier la requete :

Code :
1
2
3
4
5
6
   -- Déclaration du curseur
    CURSOR C1 IS
       SELECT MAX(TABLE.champs) AS ch1
       FROM TABLE
 
    lireC1 C1 %ROWTYPE;
J'aimerais passer en paramètre dans un cuseur une variable qui me permette de changer la fonction MAX en MIN.

Quelquechose qui ressemblerait à dans l'esprit :
Code :
1
2
3
4
5
 CURSOR C1 (v1 VARCHAR) IS
       SELECT v1(TABLE.champs) AS ch1
       FROM TABLE
 
    lireC1 C1 %ROWTYPE;
Est-ce possible ?
pegase06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 15h31   #2
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
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
65
 
10g SOC5> CREATE TABLE dvp(n number(6));
 
TABLE créée.
 
10g SOC5> 
10g SOC5> INSERT INTO dvp VALUES(12);
 
1 ligne créée.
 
10g SOC5> INSERT INTO dvp VALUES(12);
 
1 ligne créée.
 
10g SOC5> INSERT INTO dvp VALUES(120);
 
1 ligne créée.
 
10g SOC5> INSERT INTO dvp VALUES(1200);
 
1 ligne créée.
 
10g SOC5> INSERT INTO dvp VALUES(12000);
 
1 ligne créée.
 
10g SOC5> INSERT INTO dvp VALUES(120000);
 
1 ligne créée.
 
10g SOC5> INSERT INTO dvp VALUES(120000);
 
1 ligne créée.
 
10g SOC5> 
10g SOC5> declare
  2    cursor lcu(pc_min_max varchar2 DEFAULT 'min') IS
  3      SELECT decode(pc_min_max, 'min', MIN(n),
  4                                'max', MAX(n), '????')
  5      FROM dvp;
  6    ln_n dvp.n%type;
  7  begin
  8    open lcu;
  9    loop
 10      fetch lcu INTO ln_n;
 11      exit when lcu%notfound;
 12      dbms_output.put_line('MIN(n) = ' || ln_n);
 13    end loop;
 14    close lcu;
 15  
 16    open lcu('max');
 17    loop
 18      fetch lcu INTO ln_n;
 19      exit when lcu%notfound;
 20      dbms_output.put_line('MAX(n) = ' || ln_n);
 21    end loop;
 22    close lcu;
 23  end;
 24  /
MIN(n) = 12
MAX(n) = 120000
 
Procédure PL/SQL terminée avec succès.
 
10g SOC5>
D'ailleurs dans mon exemple un curseur n'est pas nécessaire puisque pour le MIN comme pour le MAX la requête ne retourne qu'une SEULE ligne.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 20h15   #3
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
La fonction decode ne ralenti pas trop le traitement de la fonction (requête exécuter plusieurs milliers de fois) et j'ai lu qu'elle allai être déprécié.
pegase06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 20h52   #4
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
bah... tu peux aussi mettre un CASE WHEN...

ça c'est toujours d'actualité !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 20h54   #5
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
Citation:
Envoyé par Yorglaa
bah... tu peux aussi mettre un CASE WHEN...

ça c'est toujours d'actualité !
Pas dans un curseur (il attends une requête Select). A moins qu'on puisse mettre le CASE dans le SELECT ?
pegase06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 20h55   #6
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
oui bien sûr !
et même dans la clause where si tu veux...
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 22h09   #7
Membre éclairé
 
Inscription : décembre 2004
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2004
Messages : 349
Points : 367
Points : 367
... je ne voudrais pas parraitre ringard et je sais que la version de db a été citée, mais j'attire votre attention sur le fait que CASE ne peut être utilisé sur d'anciennes versions ....

CDLT.
taska est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2007, 22h13   #8
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
Citation:
Envoyé par taska
... je ne voudrais pas parraitre ringard et je sais que la version de db a été citée, mais j'attire votre attention sur le fait que CASE ne peut être utilisé sur d'anciennes versions ....

CDLT.
Certes...
mais là on s'occupe d'un cas en 10.2, non ?

du coup on ne vas pas se priver de citer une solution parce qu'elle est incompatible avec des versions plus ancienne, non ?
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 10h52   #9
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
Citation:
Envoyé par Yorglaa
oui bien sûr !
et même dans la clause where si tu veux...
Je n'arrive pas a mettre de CASE ou de IF dans la clause WHERE.
pegase06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 11h32   #10
Membre émérite
 
Avatar de Yorglaa
 
Inscription : janvier 2004
Messages : 845
Détails du profil
Informations personnelles :
Âge : 41
Localisation : Suisse

Informations forums :
Inscription : janvier 2004
Messages : 845
Points : 939
Points : 939
... de IF c'est certains ! impossible !

par contre, un exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE test(aaa number, bbb date, ccc date, xxx number, yyy varchar2(20)) ;
 
 
SELECT
        T.xxx
        , T.yyy
FROM
        Test T
WHERE
        Case When
                T.aaa = 1
             Then
                T.bbb
             Else
                T.ccc
        End     =   sysdate ;
ça fonctionne très bien !
__________________
Il est plus facile de voir les signes avant-coureurs après coup que l'inverse !

Yorglaa
Yorglaa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 12h17   #11
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Citation:
Envoyé par pegase06
Je n'arrive pas a mettre de CASE ou de IF dans la clause WHERE.
Vous ne nous aidez pas beaucoup.
On doit deviner les requêtes que vous avez exécutées et les éventuels messages d'erreurs que vous auriez pu avoir ?
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 13h00   #12
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
Citation:
Envoyé par Magnus
Vous ne nous aidez pas beaucoup.
On doit deviner les requêtes que vous avez exécutées et les éventuels messages d'erreurs que vous auriez pu avoir ?
J'ai essayer de mettre un IF pour ajouter une clause dans la partie WHERE. Le message d'erreur donné ne correspondait pas au problème et à la ligne.
Code :
WHERE clause 1 AND IF param1 = vrai  THEN AND clause2 END
J'ai solutionné ce problème facilement, je n'avais en fait pas pensé à utiliser un OR pour ce cas !
pegase06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 13h43   #13
Membre Expert
 
Inscription : avril 2005
Messages : 1 672
Détails du profil
Informations forums :
Inscription : avril 2005
Messages : 1 672
Points : 1 337
Points : 1 337
Dans ce cas, si vous avez solutionné votre problème, merci de nous faire partager votre solution et surtout de cliquer sur le bouton résolu.
__________________
Modérateur des forums Oracle et Langage SQL
Forum SQL : je n'interviens PAS plus de 4 fois dans une discussion car si c'est nécessaire cela prouve généralement que vous n'avez pas respecté : les règles du forum
Magnus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2007, 19h58   #14
Candidat au titre de Membre du Club
 
Inscription : décembre 2006
Messages : 71
Détails du profil
Informations forums :
Inscription : décembre 2006
Messages : 71
Points : 11
Points : 11
Citation:
Envoyé par Magnus
Dans ce cas, si vous avez solutionné votre problème, merci de nous faire partager votre solution et surtout de cliquer sur le bouton résolu.
La solution simplicime
Code :
AND clause1 AND ((param1 = vrai) AND clause 2) OR (param1 = faux))
pegase06 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 01h32.


 
 
 
 
Partenaires

Hébergement Web