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 :

Appel d'une procédure dynamique


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 20
    Par défaut Appel d'une procédure dynamique
    Voilà mon problème,

    j'ai une procédure principale avec un paramètre qui doit appeler des procédures de traitement de manière dynamique. Ces procédures de traitement sont nommées sous la forme
    Procedure_[monParametre]. Que dois-je faire ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure maProcedurePrincipale (param in out varchar2)
     
    begin
      -- MonTraitementStandard...  
      -- Appel de la procédure spécifique en fonction de param
      Procedure_||param;
    end;
    J'ai essayé de passer par des execute immediate mais ça ne marche que pour des requêtes apparemment...

    Help me ! Waiting for answers !

    PS : Vi vi j'ai fait recherche Google et Fofo avant

  2. #2
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par bebert13 Voir le message
    J'ai essayé de passer par des execute immediate mais ça ne marche que pour des requêtes apparemment...
    Non, c'est la solution et ça marche aussi avec les procédures stockées.
    http://sheikyerbouti.developpez.com/execute_immediate/

    Montre nous ce que tu as testé.

  3. #3
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Essaie ça
    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
     
    BEGIN
       FOR rec_proc IN (SELECT object_name
                          FROM all_objects
                         WHERE object_type LIKE 'PROC%'
                           AND object_name = 'PROCEDURE_'||UPPER(param)       
                           AND owner = 'SCOTT') -- tu changes le  owner 
       LOOP
           BEGIN 
              execute immediate ' begin '||rec_proc.object_name ||';  end ;';
              EXCEPTION 
              WHEN OTHERS THEN 
              DBMS_OUTPUT.PUT_LINE(SQLCODE||'-'|| SQLERRM);
            END;
       END LOOP;
    END;

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par salim11 Voir le message
    Salut,

    Essaie ça
    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
     
    BEGIN
       FOR rec_proc IN (SELECT object_name
                          FROM all_objects
                         WHERE object_type LIKE 'PROC%'
                           AND object_name = 'PROCEDURE_'||UPPER(param)       
                           AND owner = 'SCOTT') -- tu changes le  owner 
       LOOP
           BEGIN 
              execute immediate ' begin '||rec_proc.object_name ||';  end ;';
              EXCEPTION 
              WHEN OTHERS THEN 
              DBMS_OUTPUT.PUT_LINE(SQLCODE||'-'|| SQLERRM);
            END;
       END LOOP;
    END;
    Salut Salim,

    A quoi ça sert le When Others ici ? T'a peur que si une exception arrive elle ne s'affiche pas ?

  5. #5
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Salut Salim,

    A quoi ça sert le When Others ici ? T'a peur que si une exception arrive elle ne s'affiche pas ?
    Salut mnitu,

    Il faut toujours être prudent , dans ce cas oui on n'a pas besoin de la partie exception, mais c'est utile pour le cas général (procédures avec paramètres)

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Pour exécute uniquement la procédure appelée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE OR REPLACE PROCEDURE maProcedurePrincipale  ( PARAM IN  VARCHAR2) IS 
    BEGIN
       EXECUTE IMMEDIATE ' begin  PROCEDURES_'||PARAM ||';  end ;';
    EXCEPTION
       WHEN OTHERS
       THEN
          DBMS_OUTPUT.put_line (SQLCODE || '-' || SQLERRM);
    END;

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Salut Salim,

    Il ne faut pas trop en faire

    L'exemple que tu propose contient le bug numéro 1 de la programmation PL/SQL : WHEN OTHERS THEN NULL; (c'est vrai ici dans une forme élaboré).
    Il suffit de faire un set serveroutput off pour comprendre ce que je veut dire.
    De plus avant la version 10g il sera plus prudent d'ajouter un SubStr avant de passer le paramètre à la procédure Put_Line.

    Bref, la réglé d'or ignorée par pas mal du monde est:
    en général si tu ne sait pas quoi faire avec l'exception n'ajoute pas le bloc d'exception.

Discussions similaires

  1. Appel d'une procédure contenant un update dynamique
    Par ckermorgant dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 28/04/2011, 23h41
  2. [c#] Appel d'une procédure stockée Record
    Par lapartdombre dans le forum Accès aux données
    Réponses: 4
    Dernier message: 02/08/2007, 17h20
  3. Réponses: 2
    Dernier message: 10/12/2004, 15h43
  4. Appel d'une procédure stockée par un vbscript
    Par NicoNours dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/10/2004, 13h53
  5. [Reflection][Bean] Appel d'une méthode dynamiquement
    Par eraim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/04/2004, 11h07

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