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 :

[PL/SQL] appel d'une procedure dans une procedure


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut [PL/SQL] appel d'une procedure dans une procedure
    Bonjour a tous.
    J'ai (encore) un petit problème en PL/SQL a savoir, que je stocke dans un VARCHAR2 une variable contenant un nom de procédure et ensuite j'aimerai pouvoir appeller cette procédure, mais malheureusement... pif paf pouf, je n'y arrive pas....
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    PROCEDURE Execute_Automatic_Job
    IS
    CURSOR C_AUTOMATIC_JOBS IS
    				SELECT * 
                  			FROM COND_MONITOR_JOBS
    				WHERE FREQUENCY <> 0;
     
    TestName VARCHAR2(50):='PA_CONDITION_MONITORING.';
    BEGIN
     FOR C_AUTOMATIC_JOBS_ROW IN C_AUTOMATIC_JOBS
      LOOP
       IF (SYSDATE - C_AUTOMATIC_JOBS_ROW.REFERENCE_TIME)< 2/1440
       THEN 
     
         TestName :=TestName || C_AUTOMATIC_JOBS_ROW.NAME;     
         execute(TestName); -- la j'ai tout essayé...... ici est l'erreur
    	 UPDATE COND_MONITOR_JOBS 
         SET LAST_TIME = SYSDATE,
       	     REFERENCE_TIME = SYSDATE + C_AUTOMATIC_JOBS_ROW.FREQUENCY/24
         WHERE NAME LIKE C_AUTOMATIC_JOBS_ROW.NAME;
       END IF;      
     
      END LOOP;
    END;
    L'erreur :
    PLS-00201: identifier 'EXECUTE' must be declared
    J'ai lu d'autres posts sur ce forum qui parlaient de call et de execute mais il semble que ces fonctions ne peuvent etre appellées dans un code PL/SQL...
    Quelqu'un peut-il m'aiguiller ?
    Voire peut-etre au'il existe une réponse

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Bonjour,


    Je n'ai jamais essayé qqchose dans ce genre, mais peux être que ca marchera :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    execute immediate 'begin ' || TestName || '; end;';
    Si testName se termine par ; alors il ne faut pas mettre le ; devant end;

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    Et bien, tout d'abord, merci bcp pour la rapidité de ta réponse
    alors, le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     	 execute immediate 'begin '|| TestName || '; dbms_output.put_line(2+3);end;';
    marche comme qui dirait a moitié...
    disons que je vois bien le 5 (2+3 )qui s'affiche, mais la procèdure écrite dans TestName (qui devrait supprimer les données d'une table) ne s'effectue pas.... bizarre bizarre, pourtant il y a bien un commit dans ma cette procedure....
    TestName VARCHAR2(50):='PA_CONDITION_MONITOR.GetTests';
    j'ai essayé avec parenthèses, sans parenthèses...
    pourtant cette procédure marche très bien quand je l'appelle tout seule....
    Que n'ai-je pas encore essayé : :

  4. #4
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    si vous faites une trace dans la procédure appellée, elle s'affiche bien (la trace) ?

    si vous faites un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER SESSION ENABLE COMMIT IN PROCEDURE;
    , ça ne marche pas mieux ?

  5. #5
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Je crois que j'ai trouvé une piste intéressante sur Metalink (Cf. http://metalink.oracle.com/metalink/...1&p_showHelp=1) :


    (viii) The same function but executed using the new CALL statement:
    declare
    str varchar2(200);
    val number;
    ret number;
    begin
    -- Call the stored function
    str := 'CALL doubleit(:b2) INTO :b1';
    val := 30;
    EXECUTE IMMEDIATE str USING IN val, OUT ret;
    dbms_output.put_line('Result of '||val||' doubled is '||ret);
    end;
    Est-ce-que ca marche mieux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    EXECUTE IMMEDIATE 'CALL ' || TestName;

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  6. #6
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    HOURRA !!!!
    lalystar, merci bcp, tu as résolu mon pb
    LeoAnderson, j'avais déjà essayé en fait, mais ca marchait pas, cela dit merci quand même
    Ce forum, il m'aura sauvé bien desfois......

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    bizarre bizarre, en fait je viens de réessayer la première méthode avec une ature fonction et ca marche alors bon, comme ca a l'avenir j'aurais le choix.....

  8. #8
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Est-ce qu'à première vue vous relevez des différences significatives entre la procédure qui nécessite le CALL et celle pour laquelle ce n'est pas nécessaire ?

  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
    Attention, il y a peut-être un appel de FONCTION dans un exemple, et un appel de PROCEDURE dans l'autre...
    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
    Candidat au Club
    Inscrit en
    Janvier 2005
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 6
    Points : 4
    Points
    4
    Par défaut
    LeoAnderson : et bien oui, les deux procédures sont différentes :
    la première n'avait aucun argument et la deuxième en avait deux et devant mon incapacité à utiliser CALL je suis repassé à la méthode execute immediate
    est-ce que le problème viendrait de là (enfin bon, la tout marche, mais c pour la culture....), du nombre d'arguments ?
    SheikYerbouti : oui, je pense bien que c'était le pb....
    Merci encore @ tous....

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  2. [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
  3. 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
  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