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 :

récupération d'un curseur d'une proc dans une autre proc


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut récupération d'un curseur d'une proc dans une autre proc
    Bonsoir,

    Je travaill sur un package composé de :
    - une procédure permettant d'identifier un profil d'utilisateur
    - 10 procédures correspondants à mes états de restitution utilisant chacune la proc précédente.

    Chaque proc de restit est composée de la manière suivante :
    - insertion de données dans une table
    - mise à jour de champs n'ayant être pu inséré la première fois.

    Pour cette mise à jour il se peut qu'il y ait plusieurs valeurs pour un champ, il faut donc que parvienne à créer une chaine de caractères afin de faire la mise à jour avec celle-ci.
    J'ai donc décidé de créer une nouvelle procédure qui me renverrai toutes les valeurs correspondantes au champ à mettre à jour sous forme de chaine de caractères.

    Voici un extrait pour un seul champ de cette procédure:
    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
     
    CREATE OR REPLACE PROCEDURE PR_UPD_TMP_RESTIT
    (
         UPD_POLE                      IN OUT VARCHAR2
     )
    AS
    -- DECLARATION PERMETTANT DE SELECTIONNER LES CHAMPS DE MISES A JOUR
    CURSOR C_SEL_UPD_POLE
    IS
    SELECT FM.MSG_VALUE
    FROM MISSION M, DOMAINE_MISSION MD, DOMAINE D, TYPE_DOMAINE TD, FWS_MESSAGES FM, FWS_LANG FL
    WHERE M.I_MISSION = rc_sel_restit_1.I_MISSION
    AND M.I_MISSION = MD.I_MISSION
    AND MD.I_CODE_DOMAINE = D.I_CODE_DOMAINE
    AND MD.D_DEBUT_DOM = D.D_DEBUT_DOM
    AND D.I_TYPE_DOMAINE = TD.I_TYPE_DOMAINE
    AND D.DT_CREA_TDOM = TD.DT_CREA_TDOM
    AND TD.I_TYPE_DOMAINE = 1
    AND D.CD_TRAD_DOMAINE = FM.MSG_KEY
    AND FL.ID_LANG = P_LANGUE
    AND UPPER(FM.LOCALEKEY) = UPPER(FL.LANG_CODE)
    ;
    v_upd_pole              C_SEL_UPD_POLE%ROWTYPE;
    BEGIN
     
    UPD_POLE                := NULL;
     
    IF C_SEL_UPD_POLE%ISOPEN THEN
    		CLOSE C_SEL_UPD_POLE;
    END IF;
     
    OPEN C_SEL_UPD_POLE;
    	FETCH C_SEL_UPD_POLE INTO v_upd_pole;
     
    		UPD_POLE := v_upd_pole.MSG_VALUE;
     
    	        LOOP
     
    	          FETCH C_SEL_UPD_POLE INTO v_upd_pole;
    	          EXIT WHEN C_SEL_UPD_POLE%NOTFOUND;
     
    	          	UPD_POLE := UPD_POLE||''', '''||v_upd_pole.MSG_VALUE;
                  dbms_output.put_line(UPD_POLE);
    	        END LOOP;
     
      	CLOSE C_SEL_UPD_POLE;
    Définition des variables utilisées dans le code précédent :
    - Ce curseur est définit dans la proc de restitution 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CURSOR C_RESTIT_1
    IS
    SELECT *
    FROM TMP_RESTIT_1;
     
    rc_sel_restit_1 C_RESTIT_1%ROWTYPE;
    - P_LANGUE permet de choisir la langue de restitution

    Le problème que je rencontre avec cette procédure retournant les chaines de caractères aux autres procédures pour effectuer les mises à jour est le suivant :

    Il faudrait que je parvienne à donner le curseur en paramètre C_RESTIT_ en fonction du numéro de restit, et que celui-ci soit reconnu par cette procédure.
    J'ai essayé de passer le numéro de la restitution en paramètre,et de faire dans la contrainte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE M.I_MISSION = concat(concat('rc_sel_restit_', NUM_RESTIT),'.I_MISSION')
    mais cela ne marche pas.

    Alors je ne sais pas comment faire???

    PS je m'excuse pour la complexité du message mais j'ai essayé de détailler le plus possible mais en étant le plus synthétique quand même.

    Merci

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ouch... c'est très compliqué tout ça... pourrais-tu essayer de formaliser le probléme simplement

    Ex : Procédure P et Curseur C, tu veux faire ci et ça...

    Vous avez 1h et le droit à 100 mots maximum

  3. #3
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    Bon par exemple, ma procédure de restitution est comme suit pour ce qui concerne la mise à jour:
    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
     
    FOR rc_sel_restit_1 IN C_RESTIT_1
    	LOOP
    	EXIT WHEN C_RESTIT_1%NOTFOUND;
     
    		-- MISE A JOUR DU CHAMP LIB_POLE
    		v_etp_sql := 'MISE A JOUR DE LIB_POLE';
    		UPDATE TMP_RESTIT_1
    		SET LIB_POLE = (SELECT FM.MSG_VALUE
    				FROM MISSION M, DOMAINE_MISSION MD, DOMAINE D, TYPE_DOMAINE TD, FWS_MESSAGES FM, FWS_LANG FL
    				WHERE M.I_MISSION = rc_sel_restit_1.I_MISSION
    				AND M.I_MISSION = MD.I_MISSION
    				AND MD.I_CODE_DOMAINE = D.I_CODE_DOMAINE
    				AND MD.D_DEBUT_DOM = D.D_DEBUT_DOM
    				AND D.I_TYPE_DOMAINE = TD.I_TYPE_DOMAINE
    				AND D.DT_CREA_TDOM = TD.DT_CREA_TDOM
    				AND TD.I_TYPE_DOMAINE = code_pole
    				AND D.CD_TRAD_DOMAINE = FM.MSG_KEY
    				AND FL.ID_LANG = P_LANGUE
    	        		AND UPPER(FM.LOCALEKEY) = UPPER(FL.LANG_CODE))
    		WHERE TMP_RESTIT_1.I_MISSION = rc_sel_restit_1.I_MISSION;
    Le curseur C_RESTIT_1 est définit plus haut.
    Le principe de la mise à jour consiste à récupérer le libellé correspondant à un code. Cependant il peut y avoir plusieurs valeurs, ce qui est normal.
    Il faut donc que je fasse une chaine de caractères avec tous ces libellés afin de n'avoir qu'une seule valeur pour la mise à jour.

    Etant donné que j'ai plusieurs procédures de ce genre, (une par restitution), j'ai envie de faire une nouvelle procédure générique qui pourra me servir pour toutes les pocédures de restitution.

    Dans cette procédure il faudrait que je fasse un curseur correspondant à chaque select servant à faire l'update. Pour le libellé du pole de la restitution 1 par 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
     
    Cursor c_sel_pole
    is
    SELECT FM.MSG_VALUE 
                FROM MISSION M, DOMAINE_MISSION MD, DOMAINE D, TYPE_DOMAINE TD, FWS_MESSAGES FM, FWS_LANG FL 
                WHERE M.I_MISSION = rc_sel_restit_1.I_MISSION 
                AND M.I_MISSION = MD.I_MISSION 
                AND MD.I_CODE_DOMAINE = D.I_CODE_DOMAINE 
                AND MD.D_DEBUT_DOM = D.D_DEBUT_DOM 
                AND D.I_TYPE_DOMAINE = TD.I_TYPE_DOMAINE 
                AND D.DT_CREA_TDOM = TD.DT_CREA_TDOM 
                AND TD.I_TYPE_DOMAINE = code_pole 
                AND D.CD_TRAD_DOMAINE = FM.MSG_KEY 
                AND FL.ID_LANG = P_LANGUE 
                     AND UPPER(FM.LOCALEKEY) = UPPER(FL.LANG_CODE)
    ..
    et ensuite que je fasse une chaine de caractères avec le MSG_VALUE que j'aurai obtenu.

    Je pourrai donc faire dans ma proc de restitution :
    [code]
    update TMP_RESTIT_1
    SET LIB_POLE = UPD_LIB_POLE
    [\code]
    avec UPD_LIB_POLE qui aura été obtenu à partir de ma nouvelle procédure

    Voila en espérant avoir été plus clair

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Alors is j'ai bien compris, tu voudrais que C_RESTIT soit un paramétre d'entrée de ta procédure pour mutualiser toutes les restitution, c'est bien ça ?

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    yes dans ma nouvelle procédure, mais il faudrait que son indice change en fonction du numéro de la procédure de restitution.
    Et là c'st le drame!!

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ce ne sera pas possible de mettre un nom de paramétre qui change selon le besoin

    Désolé, je ne vois pas comment tu pourrais faire

  7. #7
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Sans trop comprendre le but particulier de votre procédure, sachez que vous pouvez concaténer plusieurs colonnes dans un ordre select

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select col1 || ' ' || col2 || ' ' || coln "ma colone concat" From...
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  8. #8
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    le pb sheik est que si j'ai plusieurs libllés de pole pour une mission
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    I_MISSION            I_CODE_DOMAINE    MSG_VALUE
    1                                 1                          toto
    1                                 2                          titi
    il faut que je fasse le chaine de caractères "toto, titi". ça je sais faire mais en utilisant des curseurs comme dans mon exemple du haut de la page.
    Je souhaite le faire dans une procédure à part pour m'en resservir pour chacune de mes procédures de restitution.

    Comment faire??

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Pourquoi ne pas écrire une fonction qui te retourne le résultat de la concaténation ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  10. #10
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    parce que j'ai sur l'ensemble de mes procédures une quinzaine de champs à mettre à jour donc il faudrait une procédure pour tout me retourner, afin que je puisse choisir les valeurs don j'ai besoin pour chaque procédure.

    En ce qui concerne la fonction sheik, si je concatène dans un champs OK, mais il faut que j'identifie les identifiants de missions présents dans ma table.

    Si je prends l'exemple du message précédent :
    il faut que pour I_MISSION = 1 je concatène les MSG_VALUE toto et titi, et que je balaie toute ma table.

    C'est là ou se trouve mon gros problème

  11. #11
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    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
    CREATE OR REPLACE FUNCTION Concat_valeur
    ( PN$Identifiant IN ta_table.I_MISSION%TYPE )
    RETURN VARCHAR2
    IS
      LC$Chaine Varchar2(512) ;
      CURSOR CUR IS
      Select MSG_VALUE From la_table Where I_MISSION = PN$Identifiant ;
    Begin
      For C in CUR Loop
         If CUR%ROWCOUNT > 1 Then
             LC$Chaine := LC$Chaine || ',' ;
         End if ;    
         LC$Chaine := LC$Chaine || C.MSG_VALUE ;
      End loop ;
      Return LC$Chaine ;
    End ;
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  12. #12
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    je suis désolé, je comprends tout excepté le fait suivant :
    comment PN$identifiant change de valeur sachant que je ne vais pas rentrer de valeur manuellement et que la procédure va et doit le faire pour moi??

    En fait comment peut -il savoir que mes les identifiants présents dans ma table sont 1,25,36,48 et non pas 62,75??
    C'est ce lien que je ne parviens pas à voir

  13. #13
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Il y a bien un curseur qui ramène I_MISSION à un moment ou un autre pour obtenir le contenu de MSG_VALUE ?

    sauf qu'au lieu de faire Select MSG_VALUE From ... Where I_MISSION = ...
    Vous remplacez par Select Concat_valeur( I_MISSION ) From ... Where I_MISSION = ...
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  14. #14
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    ok si j'ai bien compris j'avais :
    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
     
    UPDATE TMP_RESTIT_6
    SET LIB_POLE = (SELECT FM.MSG_VALUE
    FROM MISSION M, DOMAINE_MISSION MD, DOMAINE D, TYPE_DOMAINE TD, FWS_MESSAGES FM, FWS_LANG FL
    WHERE M.I_MISSION = rc_sel_restit_6.I_MISSION
    AND M.I_MISSION = MD.I_MISSION
    AND MD.I_CODE_DOMAINE = D.I_CODE_DOMAINE
    AND MD.D_DEBUT_DOM = D.D_DEBUT_DOM
    AND D.I_TYPE_DOMAINE = TD.I_TYPE_DOMAINE
    AND D.DT_CREA_TDOM = TD.DT_CREA_TDOM
    AND TD.I_TYPE_DOMAINE = code_pole
    AND D.CD_TRAD_DOMAINE = FM.MSG_KEY
    AND FL.ID_LANG = P_LANGUE
    AND UPPER(FM.LOCALEKEY) = UPPER(FL.LANG_CODE))
    WHERE TMP_RESTIT_6.I_MISSION = rc_sel_restit_6.I_MISSION;
    qui devient maintenant
    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
     
    UPDATE TMP_RESTIT_6
    SET LIB_POLE = (select concat_lib_pole(I_MISSION)
    FROM MISSION M, DOMAINE_MISSION MD, DOMAINE D, TYPE_DOMAINE TD, FWS_MESSAGES FM, FWS_LANG FL
    WHERE M.I_MISSION = rc_sel_restit_6.I_MISSION
    AND M.I_MISSION = MD.I_MISSION
    AND MD.I_CODE_DOMAINE = D.I_CODE_DOMAINE
    AND MD.D_DEBUT_DOM = D.D_DEBUT_DOM
    AND D.I_TYPE_DOMAINE = TD.I_TYPE_DOMAINE
    AND D.DT_CREA_TDOM = TD.DT_CREA_TDOM
    AND TD.I_TYPE_DOMAINE = code_pole
    AND D.CD_TRAD_DOMAINE = FM.MSG_KEY
    AND FL.ID_LANG = P_LANGUE
    AND UPPER(FM.LOCALEKEY) = UPPER(FL.LANG_CODE))
    WHERE TMP_RESTIT_6.I_MISSION = rc_sel_restit_6.I_MISSION
    c'est bien ça sheik??

    das ce cas, je n'ai qu'à faire la même chose pour chacun de mes libellés à mettre à jour et le tour est joué.

  15. #15
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Tout à fait. Les fonctions et procédures sont là pour nous faciliter certaines tâches complexes.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  16. #16
    Nouveau membre du Club
    Inscrit en
    Avril 2003
    Messages
    55
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 55
    Points : 28
    Points
    28
    Par défaut
    un énorme merci encore une fois skeik et un excellent week end

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

Discussions similaires

  1. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  2. portée d'une variable dans une fonction dans une méthode
    Par laurentg2003 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 29/06/2009, 19h05
  3. [POO] dans une classe, appeler une fonction dans une méthode
    Par arnaudperfect dans le forum Langage
    Réponses: 3
    Dernier message: 26/08/2007, 23h04
  4. Envoyer une formulaire dans une page dans une Frame
    Par zooffy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 29/06/2007, 10h13
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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