Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/05/2008, 17h39   #1
Invité régulier
 
Inscription : février 2007
Messages : 20
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 20
Points : 8
Points : 8
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 :
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
bebert13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 17h58   #2
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 523
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 523
Points : 3 972
Points : 3 972
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é.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 18h45   #3
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Essaie ça
Code :
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;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 19h23   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
Citation:
Envoyé par salim11 Voir le message
Salut,

Essaie ça
Code :
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 ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 19h59   #5
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
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)
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 20h13   #6
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,

Pour exécute uniquement la procédure appelée
Code :
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;
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 20h21   #7
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 320
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 320
Points : 5 839
Points : 5 839
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/05/2008, 21h07   #8
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

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

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Salut,
Oui j'utlise le dbms_output.put_line pour moi seulement, mais au travail, j' écrit toutes les erreurs dans fichier.
Code :
1
2
3
4
5
6
 
EXCEPTION
	WHEN OTHERS THEN
		utl_file.put_line(v_fichier_log,'ERREUR TRAITEMENT : ' || 
SQLERRM);
		UTL_FILE.FCLOSE(v_fichier_log);
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2008, 18h57   #9
Membre confirmé
 
Avatar de JerryMouse
 
Homme N'Guessan KOUAME
Inscription : avril 2002
Messages : 210
Détails du profil
Informations personnelles :
Nom : Homme N'Guessan KOUAME
Localisation : Côte d'Ivoire

Informations professionnelles :
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2002
Messages : 210
Points : 270
Points : 270
Envoyer un message via MSN à JerryMouse Envoyer un message via Yahoo à JerryMouse
Et si jamais la procedure a des paramètres en IN ou OUT?
__________________
Très souvent, le plus difficile est de savoir ce que l'on veut.
JerryMouse est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h32.


 
 
 
 
Partenaires

Hébergement Web