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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 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 ...

  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 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 ...)

  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
    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.

  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
    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;

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, 14h30
  2. Réponses: 2
    Dernier message: 30/03/2011, 13h34
  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, 16h11
  4. Réponses: 1
    Dernier message: 28/09/2008, 09h14
  5. Appel de fonction stockée
    Par Keph dans le forum SQL
    Réponses: 13
    Dernier message: 08/06/2007, 14h39

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