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 :

Execute Immediate + Fonction ?


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 20
    Points : 15
    Points
    15
    Par défaut Execute Immediate + Fonction ?
    Bonjour,

    je reviens un peu a la charge car je n'arrive pas a trouver une solution a mon probleme.

    Est ce que qqun pourrait m'aider ?

    Donc je suis toujours a la recherche d'une maniere d'executer du code SQl dynamique. J'ai bien compris qu'il etait possible de le faire par l'intermediaire de la commande EXECUTE IMMEDIATE.

    Seulement je n'arrive pas a trouver la syntaxe qui fonctionne dans le cas ou je veux executer une fonction donc qui renvoit un resultat.

    Qqun aurait il une idée de la syntaxe a adopter ?

    Je voudrais transformer ceci 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    FUNCTION F_Trouve_NumRes (p_num_res_int VARCHAR2) RETURN NUMBER
    	IS
    	  n_num_res				 NUMBER;
    	BEGIN
     
    		SELECT num_res
    		INTO n_num_res
    		FROM CARTON_RESA
    		WHERE num_res_int = p_num_res_int;
     
    		RETURN n_num_res;
     
    		EXCEPTION
    			WHEN NO_DATA_FOUND THEN
    				RETURN NULL;
     
    	END F_Trouve_NumRes;
     
    PROCEDURE Test_Execut_Immediate
    IS
    retour NUMBER;
    BEGIN
     
    	 param := '990180045300';
     
    	 retour := F_Trouve_NumRes (param);
     
    END Execut_Immediate;
    J'ai essayer plusieurs syntaxe avec execute immediate sans trouver celle qui fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	 EXECUTE IMMEDIATE 'retour:= F_Trouve_NumRes (''990180019700'')';
    	 EXECUTE IMMEDIATE 'F_Trouve_NumRes (''' || param || ''')' INTO retour;
    Quelqu'un aurait il une idée ?

    D'avance merci

  2. #2
    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
    EXECUTE IMMEDIATE vous permet simplement d'exécuter une chaine en tant que commande SQL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDATE 'UPDATE TABLE1 SET COL1=2';
    l'avantage étant que vous pouvez construire dynamiquement la chaine argument dans une procédure.

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Sinon tu crées une Procédure avec un paramètre OUT.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'BEGIN P_Trouve_NumRes (:v_in, :v_out); END;' USING '990180019700', OUT v_retour ;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  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
    Citation Envoyé par McM
    Sinon tu crées une Procédure avec un paramètre OUT.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'BEGIN P_Trouve_NumRes (:v_in, :v_out); END;' USING '990180019700', OUT v_retour ;
    ce qui n'a aucun intérêt...
    autant faire dans un bloc PL/SQL

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE
       v_out ...
    BEGIN
        P_Trouve_NumRes('990180019700', v_out);
    END;
    /
    Le sql dynamique est intérêssant quand vous avez 10000 focntions identiques à écrire au détail prêt que c'est juste le nom de la table qui change par exemple.

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par LeoAnderson
    Citation Envoyé par McM
    Sinon tu crées une Procédure avec un paramètre OUT.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'BEGIN P_Trouve_NumRes (:v_in, :v_out); END;' USING '990180019700', OUT v_retour ;
    ce qui n'a aucun intérêt...
    autant faire dans un bloc PL/SQL
    Eh bien si ça en a : Un collègue a besoin de lancer des fonctions sur des bases distantes (mais le DBLINK est un paramètre de la procédure d'appels) qui font des UPDATE/INSERT et qui retournent le nombre d'enreg.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    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
    N'oubliez-pas qu'une fonction peut être invoquée sur la table DUAL....

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Execute immediate "Select ma_function(...) From Dual" Into ma_variable ;
    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

  7. #7
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Sauf si la fonction fait du DML.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  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
    Pourriez-vous détailler un peu en quoi l'exemple que vous donniez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'BEGIN P_Trouve_NumRes (:v_in, :v_out); END;' USING '990180019700', OUT v_retour ;
    utilise de façon intérêssante le sql dynamique ?

  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
    Effectivement, le coté dynamique n'est interessant que si vous ignorez le nom de la fonction au moment de la compilation.
    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
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    Merci pour vos reponses.

    Pour entrer plus en detail dans mon probleme, j'ai besoin de ca a cause des DBLINK.

    Il s'agit d'une base de donnée accessible sur internet via une interface web, et qui a pour but d'interroger des bases distantes. Sur ses bases se trouvent donc des fonctions (toutes les bases sont identique ou presque) qui me permettent d'interroger des tables et de remonter a ma base "internet" le resultat adequat. Seulement en fonction de certains parametres je ne dois pas interoger la meme base distante, et commme en plus plusieurs personne peuvent se connecter a un meme instant au web pour interrogation, je dois utiliser des DBLink variable qui tiennent compte de la session et par consequent avec des noms different.

    Du coup au lieu de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    ...
    n_retour := MaFonction@DBL_BaseDistante(param);
    ...
    je dois trouver un moyen de faire qqchose comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    ...
    v_DBL_BaseDistante := TrouveNomDBLink(param);
     
    EXECUTE IMMEDIATE 'MaFonction@' || v_DBL_BaseDistante || '(param)' INTO n_retour;
    ...
    Le hic c'est que mes fonctions n'etaient pas prevu au depart pour devoir utiliser un DBLink dont le nom est variable, du coup je prefererais trouver une solution qui ne m'oblige pas a modifier le code des fonctions appelées et par consequent de mettre a jour TOUTES les bases distantes.

    Je vais me pencher sur ce que vous m'avez proposer concernant la table DUAL en esperant trouver qqchose qui fonctionne.

    Si quelqu'un a une idée lumineuse je suis preneur.

    D'avance merci.

  11. #11
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par LeoAnderson
    Pourriez-vous détailler un peu en quoi l'exemple que vous donniez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'BEGIN P_Trouve_NumRes (:v_in, :v_out); END;' USING '990180019700', OUT v_retour ;
    utilise de façon intérêssante le sql dynamique ?
    Désolé, mon exemple est EXACTEMENT ce que cherche à faire zorglob, mais pour coller à son premier code, je n'avais pas fait la modif DBLINK.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXECUTE IMMEDIATE 'BEGIN P_Trouve_NumRes@' || v_dblink || '(:v_in, :v_out); END;' USING '990180019700', OUT v_retour ;
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 20
    Points : 15
    Points
    15
    Par défaut
    En tout cas merci de votre aide, et grand grand merci a McM cela fonctionne tres bien. Vous venez de m'enlever une enorme epine du pied

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

Discussions similaires

  1. [9i+] execute immediate vs regular fonction call
    Par Vld44 dans le forum PL/SQL
    Réponses: 3
    Dernier message: 07/05/2012, 17h22
  2. Besoin d'aide pour la fonction execute immediate
    Par kevin8100 dans le forum Oracle
    Réponses: 13
    Dernier message: 25/06/2007, 15h00
  3. EXECUTE IMMEDIATE avec fonction
    Par aechevar dans le forum Oracle
    Réponses: 1
    Dernier message: 07/07/2006, 20h05
  4. Execute immediate et nom reserves
    Par nuke_y dans le forum Oracle
    Réponses: 3
    Dernier message: 22/11/2004, 18h17
  5. [Reflection] Executer une fonction dont le nom est contenu dans un String
    Par christobal dans le forum API standards et tierces
    Réponses: 8
    Dernier message: 05/07/2004, 15h23

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