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 :

[ORACLE9i] Appelle de fonction stockée en SQL Dynamique


Sujet :

Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut [ORACLE9i] Appelle de fonction stockée en SQL Dynamique
    Bonjour,

    Je n'arrive pas à appeller une fontion d'un package en SQL dynamique.

    J'ai essayé ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DECLARE
      TYPE refCursor is ref cursor;
      myCursor refCursor;
      plsql_block VARCHAR2(500);
    BEGIN
      plsql_block := 'BEGIN :myCursor := Mon_package.Ma_procedure; END;';
      EXECUTE IMMEDIATE plsql_block USING OUT myCursor;
    END;
    et ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE
      TYPE refCursor is ref cursor;
      myCursor refCursor;
      plsql_block VARCHAR2(500);
    BEGIN
      plsql_block := 'BEGIN Mon_package.Ma_procedure; END;';
      EXECUTE IMMEDIATE plsql_block INTO myCursor;
    END;
    Dans les deux cas j'ai une des erreurs suivantes :
    1 - "Exception d'E/S : Software cause connection abort : socket write error"
    2 - "Il n'y plus de données à lire dans la socket"
    3 - "OALL8 est dans un état incohérent"

    Quelqu'un a t'il la solution ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    pourquoi faire du SQL dynamique ???

    Pour l'exercice de style essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     plsql_block := select Mon_package.Ma_fonction from dual;

  3. #3
    Expert confirmé
    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
    Par défaut
    ou encore plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_variable := mon_package.ma_fonction() ;

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Citation Envoyé par Fred_D
    pourquoi faire du SQL dynamique ???
    En faite le nom de la procedure appelée correspond à un VARCHAR2 dans une table.

    Citation Envoyé par Fred_D
    Pour l'exercice de style essaye :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     plsql_block := select Mon_package.Ma_fonction from dual;
    erreur de syntaxe ("Symbole "SELECT" rencotr à la place d'un des sympboles suivant ...)

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Citation Envoyé par SheikYerbouti
    ou encore plus simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_variable := mon_package.ma_fonction() ;
    Euh ... ca je sais faire ...

  6. #6
    Expert confirmé
    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
    Par défaut
    Dans l'instructino execute immediate, BEGIN et END ne doivent être saisis que pour un bloc multi-instruction.
    Sinon, la syntaxe est simple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Declare
      LC$Proc Varchar2(100) := 'mon_pakage.ma_fonction' ;
      LN$Num  number ; -- valeur de retour de la fonction
    Begin
      execute immediate LC$Proc Into LN$Num ;
    End;

  7. #7
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    J'ai tapé:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    DECLARE
      TYPE refCursor is ref cursor;
      myCursor refCursor;
      plsql_block VARCHAR2(500);
    BEGIN
      plsql_block := 'mon_pakage.ma_fonction' ;
      EXECUTE IMMEDIATE plsql_block INTO myCursor;
    END;
    ce qui me renvoie une message d'erreur comme quoi l'instruction n'est pas valide (ORA-0900)

    (avec un ';' à la fin du bloc ... pareil).


    Celà vient peut être du fait que mon type de retour est un curseur ur référence ? ...

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    ....le BEGIN et le END doivent être nécessaire ...

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par requinc
    En faite le nom de la procedure appelée correspond à un VARCHAR2 dans une table.



    erreur de syntaxe ("Symbole "SELECT" rencotr à la place d'un des sympboles suivant ...)
    j'ai oublié les '

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plsql_block := 'select Mon_package.Ma_fonction from dual';

  10. #10
    Expert confirmé
    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
    Par défaut
    Effectivement la syntaxe doit passer par Select ... From DUal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare
      lc$cmd  varchar2(100) := 'select mon_package.ma_fonction(...) from dual' ;
      ln$i    number ;
    begin
      execute immediate lc$cmd into ln$i ;
    end;

  11. #11
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Ca passe. Merci à tous les deux.

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 9
    Par défaut
    Problème résolu.

    Le code final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE
      TYPE refCursor IS REF CURSOR;
      myCursor refCursor;
      plsql_block VARCHAR2(500);
    BEGIN
      plsql_block := 'SELECT mon_pakage.ma_fonction FROM DUAL';
      EXECUTE IMMEDIATE plsql_block INTO myCursor;
    END;

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Bonjour à tous,

    Je reprend ce post avec une question supplémentaire, apparemment cet appel dynamique de function / proc stockée ne fonctionne pas avec une proc qui met à jour la BD, ça plante avec l'erreur ORA-14551 : impossible d'effectuer une opération DML dans une interrogation.

    Serait-il possible d'appeler dynamiquement une proc qui met à jour la bd ?

    Je suis sous Oracle 10g.

    Cordialement.

  14. #14
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DECLARE
      plsql_block VARCHAR2(500);
    BEGIN
      plsql_block := 'BEGIN mon_pakage.ma_proc; END;';
      EXECUTE IMMEDIATE plsql_block;
    END;

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    réponse à la vitesse de la lumière !
    Merci beaucoup.

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Euh petit pb encore pour l'appel d'une fonction qui retourne une valeur, j'ai fait ça :

    execute immediate 'declare codRet varchar2(2) := ''OK''; begin codRet :=' || script || '; end;' into codRet;

    La fonction s'exécute correctement, mais à la fin il y a un plantage :
    ORA-01007: la variable n'est pas dans la liste SELECT
    ORA-06512: à "USER.PACK_BILE_LANCEUR", ligne 57
    ORA-06512: à ligne 4

    Je pense que c'est presque bon...

  17. #17
    Membre Expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Par défaut
    Lisez le tuto de Sheik, vous trouverez la réponse à votre problème :
    http://sheikyerbouti.developpez.com/...mmediate/#L4.1

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 155
    Par défaut
    Merci beaucoup
    (il suffisait de faire :
    execute immediate 'begin :1 :=' || script || '; end;' using out codRet

    Cordialement

Discussions similaires

  1. Appel de fonction depuis une table dynamique
    Par kap dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/04/2011, 15h30
  2. Réponses: 2
    Dernier message: 30/03/2011, 14h34
  3. [SQL-Server] Comment appeller une fonction stockée en MS SQLServer depuis PHP ?
    Par momoG dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 04/12/2008, 17h11
  4. Réponses: 1
    Dernier message: 28/09/2008, 10h14
  5. Appel de fonction stockée
    Par Keph dans le forum SQL
    Réponses: 13
    Dernier message: 08/06/2007, 15h39

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