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 :

Procedure stockée avec Parametres complexes


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Procedure stockée avec Parametres complexes
    Salut ts le monde,
    Je n'arrive pas à passer un param complexe pour un where in (sous 8i).

    Par ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     PROCEDURE test_tableau (i_annee in varchar, outcur  out outcur) is
      begin      
        OPEN outcur FOR SELECT * from popi_annee t where t.pa_annee in (i_list);
      end;
    Ca fonctionne pour test_tableau('2004');
    mais pas pour test_tableau('2004,2005,2006');
    (je comprend pourquoi ça ne marche pas (2004,2005,2006 n'est pas un num) mais je n'ai pas de solution pour le faire fonctionner.

    (Le curseur est récupéré par un recordset en asp).

    Merci d'avance !

  2. #2
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    C'est normal que ça ne marche pas car '2004,2005,2006' est différent de '2004','2005','2006'
    Moi à ta place je ferai un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPEN outcur FOR SELECT * from popi_annee t where t.pa_annee in (select distinct t.pa_annee from popi_annee t);
    et puis tu passes plus de param i_list

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ta remarque est juste : '2004,2005,2006' est différent de '2004','2005','2006'.
    et je ne sais pas comment transformer '2004,2005,2006' en '2004','2005','2006' pour le mettre dans le where in.
    J'ai essayé de remplir un TABLE mais ....
    La seule solution que j'ai c'est de créer une table pour faire un peu ce que tu dis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create tbl_param
    remplir tbl_param avec i_annee
    puis 
    OPEN outcur FOR SELECT * from popi_annee t where t.pa_annee in (select distinct t.pa_annee from tbl_param t);
    Il faut que je regarde du coté des fonctions peut-être ?

    Mais ça me semble très compliqué. Je me dis qu'il doit y avoir un truc simple pour envoyer directement la valeur d'un param dans un sql where.

    Je dois préciser que c'est un ex simple et que j'ai d'autre critères à passer.

    par ex : test_tableau (param1, i_annee, param2, ...)

    Si j'ai besoin du critère i_annee (i_list est une erreur de copier/coller), c'est parce que l'utilisateur sélectionne une, plusieurs ou aucune années à l'écran et je dois sortir les enr. correspondant à ces années.

    to be continued ...

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Si le format de i_annee est strict :
    2004,2005,2006 ou 2004 ou 2004,2006 (séparés par des , et pas d'espace - pour les espaces on peut faire un replace(i_annee, ' '))

    Tu utilises instr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * from popi_annee t 
    where INSTR(','|| i_annee || ',', ',' || t.pa_annee || ',') > 0
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 78
    Points
    78
    Par défaut
    Ou sinon tu peux essayer de passer en paramètre des tableaux contenant toutes tes données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE T_TAB_ANNEE IS TABLE OF INTEGER INDEX BY BINARY_INTEGER;
    Tu remplis ton tableau en entrée de ta procédure, puis tu le passes en paramètre de ta procédure et après tu reconstruit ta requete en lisant ton tableau
    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
     
    PROCEDURE test_tableau (tab_annee in T_TAB_ANNEE)
    BEGIN
    liste_annee VARCHAR2(50);
    cpt integer;
     
    cpt := 1;
    liste_annee := '(';
     
    while tab_annee <> ''
    loop
       liste_annee := liste_annee || '''' || tab_annee(cpt) || ''''
       cpt := cpt+1;
    end loop
    liste_annee := liste_annee || ')';
     
    etc ....
     
    END;
    Bref comme ça tu peux passer tous les arguments que tu veux et reformater tes requetes en dynamique

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    La requete dynamique est exclue car mes prostoc sont lourdes (+de 100 lignes).

    Domage car un simple varchar aurait fait l'affaire.

    En fait, j'ai trouvé la solution sur asktom.
    Et je la met pour les autres.

    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
    create or replace function in_list(p_string in varchar2 ) return in_listType is
            l_string        long default p_string || ',';
            l_data          myTableType := in_listType();
            n               number;
        begin
          loop
              exit when l_string is null;
              n := instr( l_string, ',' );
             l_data.extend;
             l_data(l_data.count) := ltrim( rtrim( substr( l_string, 1, n-1 ) ) );
             l_string := substr( l_string, n+1 );
        end loop;
     
        return l_data;
      end;
     
     
     
      PROCEDURE test_tableau ( i_list varchar2, outcur  out outcur) is
        TYPE tbl_ann IS TABLE of varchar(4) INDEX BY BINARY_INTEGER;
      begin
         OPEN outcur FOR SELECT * from popi_annee t where t.pa_annee in (
               select * from THE ( select cast(in_list(i_list) as mytableType ) from dual )
         );
      end;
    La solution de McM fonctionne aussi très bien pour ce cas.
    J'ai le choix, c'est super.

    Merci.

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

Discussions similaires

  1. Appeler procedure stockée avec un parametre
    Par clouddd dans le forum ASP.NET
    Réponses: 11
    Dernier message: 12/10/2009, 11h26
  2. procedure stockée avec saisie de parametre
    Par esthr dans le forum Oracle
    Réponses: 4
    Dernier message: 20/02/2007, 19h57
  3. probleme procedure stockée avec Mysql
    Par emna_bz dans le forum Installation
    Réponses: 2
    Dernier message: 01/02/2006, 16h26
  4. Procedure stockée avec un parametre en OUTPUT
    Par Nadaa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/09/2004, 20h06
  5. Procedure stockée avec ntext dans SQL server 2000
    Par nagababa dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/11/2003, 20h46

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