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 :

[Oracle 10.2] PL/SQL Paramètre Curseur


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     CURSOR C1 (v1 VARCHAR) IS
           SELECT v1(table.champs) AS ch1
           FROM table
     
        lireC1 C1 %ROWTYPE;
    Est-ce possible ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    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
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    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é.

  4. #4
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    bah... tu peux aussi mettre un CASE WHEN...

    ça c'est toujours d'actualité !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    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 ?

  6. #6
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    oui bien sûr !
    et même dans la clause where si tu veux...

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    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
    Par défaut
    ... 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.

  8. #8
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    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 ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    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.

  10. #10
    Membre émérite Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Par défaut
    ... de IF c'est certains ! impossible !

    par contre, un 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
    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 !

  11. #11
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    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 ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  13. #13
    Membre Expert

    Profil pro
    Inscrit en
    Avril 2005
    Messages
    1 673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 673
    Par défaut
    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.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 71
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    AND clause1 AND ((param1 = vrai) AND clause 2) OR (param1 = faux))

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

Discussions similaires

  1. [Oracle 8i][PL/SQL] Exceptions & Curseur
    Par Bahan dans le forum Oracle
    Réponses: 3
    Dernier message: 31/08/2006, 16h34
  2. Type de données Oracle 9-10 et SQL Server 2000
    Par fabrice_bruxelles dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 05/10/2005, 11h21
  3. [Oracle 9.1] Plantage SQL+ à cause d'une requête
    Par ftrifiro dans le forum Oracle
    Réponses: 8
    Dernier message: 04/10/2005, 15h08
  4. [ADO.Net][C#/Oracle] Comment utiliser une requête paramètrée ?
    Par kaboume dans le forum Accès aux données
    Réponses: 4
    Dernier message: 05/07/2005, 14h50
  5. ORACLE / DEVELOPPEMENT WEB / FENETRE SQL
    Par mimi_été dans le forum Oracle
    Réponses: 4
    Dernier message: 15/02/2005, 18h50

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