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

Oracle Discussion :

Multiple Proc stocké + Curseur Comment faire


Sujet :

Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut Multiple Proc stocké + Curseur Comment faire
    Bonjour,

    Je sais le titre est pas très clair mais c'est dure à résumé en quelques mots.

    Bon voila, j'ai 1 Package a l'intérieur duquel j'ai 3 Procédure stockées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    Proc A appele Proc B et Proc C
     
    Proc B renvoi un curseur 
    Proc C renvoi un curseur 
     
    Et Proc A devrait renvoyer un curseur qui devrait plus ou moins etre une concaténation des deux curseurs.
    Voici mon code actuel :
    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
     
    create or replace package PA_COURRIER is
     
      -- Public type declarations
      type CourrierCurType is REF CURSOR;
     
      PROCEDURE PR_ADRESSE_CLIENT (cur_courrier OUT CourrierCurType
                                      , pClient NUMBER
                                      , pEtab NUMBER
                                      , pAffaires NUMBER
                                      , pBenef VARCHAR2
                                      , pActivite VARCHAR2
                                      , pAssocie NUMBER
                                      , pTypeRequete NUMBER);
    end PA_COURRIER;
    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
     
    create or replace package body PA_COURRIER is
     
        PROCEDURE PR_ADRESSE_CLIENT (cur_courrier OUT CourrierCurType
                                        , pClient NUMBER
                                        , pEtab NUMBER
                                        , pAffaires NUMBER
                                        , pBenef VARCHAR2
                                        , pActivite VARCHAR2
                                        , pAssocie NUMBER
                                        , pTypeRequete NUMBER)
        As                                
        Begin
              Open cur_courrier for
              select civ.lib_civ, civ.lib_civ2, cli.lib_prenomcli, cli.lib_nom
               , cli.lib_numvoi, typvoi.lib_typvoi,  cli.lib_voi
               , cli.lib_adr2, cli.lib_adr3
               , cli.cod_pst, cli.lib_vilcli, pay.lib_pay
              from op.t_clients cli
              , op.tr_type_voie typvoi
              , op.tr_pays pay
              , op.tr_civilite civ
              where num_cli = pClient
              and cli.cod_typvoi = typvoi.cod_typvoi (+)
              and cli.cod_pay = pay.cod_pay (+)
              and civ.cod_civ (+) = cli.cod_civ ;
        End PR_ADRESSE_CLIENT;
     
    end PA_COURRIER;
    Mon probleme principale est que je ne vois pas comment réutilisé mon curseur dans la proc A?

    N'hésitez pas à poser des questions si je suis pas clair, ah oui encore une info Oracle8i, VB6.

    Merci[/code]

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    question bête... c'est quoi l'intérêt d'une telle manip ? Pourquoi ne pas simplement faire une vue ?

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    Oh ta question est loin d'etre bete en faite je compte utilisé des vues mais aussi des procédures de ce type.

    J'explique, en fait j'ai actuellement un module VB qui contient un case avec 100 cas et 100 requetes sql.

    Dans ces 100 requetes, il y a en gros 60 qui renvoie une partie de donnée identique à savoir l'adresse des clients.

    C'est 100 requetes sont utilisés pour générer 100 courriers derriere.

    Donc vu que l'on vient de me demander de modifier les regles de gestion et qu'au lieu d'avoir une adresse, j'en aurais maintenant 5, et qu'il est hors de question que je modifie c'est 100 requetes ainsi que c'est 100 courriers et de périnisé ce système que je trouves très mal conçu.

    J'ai décidé de tout passer en pl/sql, et de faire +/- une proc par courrier ,qui appelera des procédures qui elle meme appeleront des vues, et qui renverra aussi des données spécifiques à certain courrier.

    J'espere que c'est plus clair.

  4. #4
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    Ah oui, j'aurais besoin de passer un ou des paramètre(s) à ma vue c'est possible?

  5. #5
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Bon... pour répondre à la question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    PROCEDURE A AS 
    l_courrier PA_COURRIER.CourrierCurType;
     
    BEGIN
     
    PR_ADRESSE_CLIENT (l_courrier,...); 
    FETCH l_courrier INTO ...
     
    CLOSE l_courrier;
    END;
    /
    Ne surtout pas oublier le CLOSE

    http://asktom.oracle.com/pls/ask/f?p=4950:8:7311735126769953607::NO::F4950_P8_DISPLAYID,F4950_P8_CRITERIA:1606716582692

    EDIT : non pas de vue paramétrer mais tu peux passer par des variables dans un package

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    Merci orafrance, j'ai commencé à étudier le document.

    Tiens peux-t'on en pl/sql oracle8i faire de l'héritage de procédure stocké ou fonctions?

  7. #7
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est à dire ? Je ne pense pas mais il y a peut-être un contournement

  8. #8
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    En fait,

    j'ai une proc stocké A qui renvoie une adresse de correspondance, qui est basé sur des règles de gestion et sur 4 vues.
    j'ai plusieurs procédures stocké qui doivent appeler cette procédure et qui doivent aussi appeler une autre procédure B du meme style.

    Et j'aimerais donc faire une procédure générique qui appele A et B.

    Et je voudrais que toutes mes procédures hérite de ma procédure générique histoire de ne pas avoir à réécrire les appeles...

    T'en pense quoi?

  9. #9
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    j'en pense que rien ne t'empéche de créer une procédure qui lance A et B avec les paramètres que tu veux... je crains de ne pas bien saisir la problématique en fait

  10. #10
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    Oui mais en fait je serais obligé de faire toujours appel à cette procédure et moi je voyais plutot un systeme ou héritait de cette procédure...

    Je comprends que tu es du mal à comprendre car c'est encore en gestation dans ma tete...

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    orafrance tu pourrais m'expliquer comme on peut utilisé une variable de package dans une vue, car je pense que cela serais vraiment bien pour ma problematique

  12. #12
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE PACKAGE list_variable AS 
     
    ma_variable NUMBER;
     
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CREATE OR REPLACE VIEW ma_vue AS 
    SELECT ma_col FROM ma_table
    WHERE ma_col = list_variable.ma_variable;
    Pour l'utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    BEGIN
    list_variable.ma_variable = 1;
    END;
    /
     
    SELECT * FROM ma_vue;

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    Eh bien c'est exactement ce que j'ai fais avant de poser la question mais il veut pas compiler ma vue.
    Il me dit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR à la ligne 10 :
    ORA-00904: Nom de colonne non valide
    Voici mon code :
    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 or replace package PA_COURRIER is
     
      pa_numcliclient number := 32685;
      -- Public type declarations
      type CourrierCurType is REF CURSOR;
     
      PROCEDURE PR_ADRESSE_CLIENT (cur_courrier OUT CourrierCurType
                                      , pClient NUMBER
                                      , pEtab NUMBER
                                      , pAffaires NUMBER
                                      , pBenef VARCHAR2
                                      , pActivite VARCHAR2
                                      , pAssocie NUMBER
                                      , pTypeRequete NUMBER);
    end PA_COURRIER;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    create or replace view VI_ADRESSE_CLIENT as
              select civ.lib_civ, civ.lib_civ2, cli.lib_prenomcli, cli.lib_nom
               , cli.lib_numvoi, typvoi.lib_typvoi,  cli.lib_voi
               , cli.lib_adr2, cli.lib_adr3
               , cli.cod_pst, cli.lib_vilcli, pay.lib_pay
              from op.t_clients cli
              , op.tr_type_voie typvoi
              , op.tr_pays pay
              , op.tr_civilite civ
              where num_cli = op.pa_courrier.pa_numcliclient
              and cli.cod_typvoi = typvoi.cod_typvoi (+)
              and cli.cod_pay = pay.cod_pay (+)
              and civ.cod_civ (+) = cli.cod_civ ;
    Si tu as une idée je suis preneur

  14. #14
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est pa_courrier.pa_numcliclient et pas op.pa_courrier.pa_numcliclient

  15. #15
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    désolé mais meme sans "op" qui est le proprietaire cela ne fonctionne pas.

    Je suis en 8i, et je me demande si cela fonctionne en 8i, ce style de ruse

  16. #16
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    bizarre... essaye ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE OR REPLACE FUNCTION view_pa_numcliclient
    RETURN INTEGER AS
    RETURN PA_COURRIER.pa_numcliclient;
    END;
    /
    et remplace pa_courrier.pa_numcliclient par view_pa_numcliclient

  17. #17
    Membre confirmé
    Inscrit en
    Décembre 2003
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 102
    Par défaut
    Merci avec cela ça marche

    Tiens une autre question qui me vient à l'esprit peut-on faire cela :

    - écrire une fonction qui renvoie un cursor (plusieurs ligne, plusieur colonne)
    - ensuite utilisé la fonction comme cela :
    select * from ma_fct_qui_retourne_un_curseur

    Est-ce que cela peut marcher modulo la syntaxe, ou est-ce que je suis sur un nuage dont il faudrait que je redescende rapidement

    Encore merci pour l'astuce

  18. #18
    Membre confirmé
    Inscrit en
    Novembre 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 29
    Par défaut
    ma proposition vaut sans doute deux balles, mais pourquoi ne pas avoir carrement une table de parametrage au lieu du package ?
    un peu comme une DUAL, mais qui serait à toi ....
    Une colonne, un enreg

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

Discussions similaires

  1. Comment faire un Curseur dans Proc Stockée
    Par Cazaux-Moutou-Philippe dans le forum Firebird
    Réponses: 1
    Dernier message: 20/01/2009, 12h08
  2. Réponses: 10
    Dernier message: 03/11/2008, 19h40
  3. Le select multiple d'HTML, ou comment faire un "panier" ?
    Par lacombefr dans le forum Webdesign & Ergonomie
    Réponses: 3
    Dernier message: 14/10/2008, 15h21
  4. Héritage multiple en C++/CLI: comment faire svp?
    Par Rodrigue dans le forum C++/CLI
    Réponses: 3
    Dernier message: 03/03/2008, 07h07
  5. [AS400] Comment faire des procédures stockées ?
    Par marsup54 dans le forum DB2
    Réponses: 6
    Dernier message: 22/08/2005, 15h34

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