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

PL/SQL Oracle Discussion :

Fonction renvoyant une occurrence (ROWTYPE) et test depuis SQL Developer [11gR2]


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Fonction renvoyant une occurrence (ROWTYPE) et test depuis SQL Developer
    Bonjour.

    Je souhaite disposer du code me permettant de réaliser ce cas d'utilisation :
    1. Déclarer une fonction PL/SQL qui renvoie un enregistrement unique et complet d'une table selon une valeur de sa clé
    2. Tester cette fonction depuis SQL Developper

    Voici le code de déclaration de ma fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create or replace 
    FUNCTION FNC_SAA_GetOrganeById 
    (
      ORG_ID IN VARCHAR2,  
      ORGANE OUT rfp_organe_org%ROWTYPE  
    ) 
    RETURN NUMBER AS
     
    BEGIN
      SELECT * INTO ORGANE FROM rfp_organe_org WHERE org_code = ORG_ID;
      RETURN 1;
    END FNC_SAA_GetOrganeById;
    Je ne sais pas quel type utiliser dans le code d'appel pour récupérer l'enregistrement en sortie de fonction (ici, test avec REFCURSOR) ... mais le code d'appel est celui-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    variable RET_ORGANE REFCURSOR;
    variable RET_CODE NUMBER;
    execute :RET_CODE := fnc_saa_getorganebyid('A112',:RET_ORGANE);
    print RET_CODE;
    print RET_ORGANE
    J'obtiens un message d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PLS-00306: numéro ou types d'arguments erronés dans appel à 'FNC_SAA_GETORGANEBYID'
    Comment valider le code de ma fonction en affichant le contenu du paramètre de sortie 'ORGANE' ??
    Merci de votre aide.

  2. #2
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Validation par procédure stockée.
    J'ai trouvé une solution me permettant de valider le code de la fonction depuis une procédure dont voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    create or replace 
    PROCEDURE TEST_FNC_SAA AS
     RET_ORGANE rfp_organe_org%ROWTYPE;
     RET_CODE NUMBER := 0;
    BEGIN
     RET_CODE := fnc_saa_getorganebyid('A11',RET_ORGANE);
     DBMS_OUTPUT.PUT_LINE(RET_CODE);
     DBMS_OUTPUT.PUT(RET_ORGANE.org_code || ' ');
     DBMS_OUTPUT.PUT(RET_ORGANE.org_libelle_long || ' ');
     DBMS_OUTPUT.NEW_LINE;
    END;
    Je reste intéressé par une solution "pure SQL" (toujours avec SQL Developper)

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Utilisez le type sys_refcursor en paramètre OUT.
    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
    30
    31
    32
    33
    34
    35
    SQL> CREATE OR REPLACE
      2  FUNCTION FNC_SAA_GetOrganeById
      3  (
      4    ORG_ID IN emp.empno%type,
      5    ORGANE OUT sys_refcursor
      6  )
      7  RETURN NUMBER AS
      8
      9  BEGIN
     10    open organe for SELECT empno, ename, sal FROM emp WHERE empno = ORG_ID;
     11    RETURN 1;
     12  END FNC_SAA_GetOrganeById;
     13  /
     
    Function created.
     
    SQL> variable RET_ORGANE REFCURSOR;
    SQL> variable RET_CODE NUMBER;
    SQL> execute :RET_CODE := fnc_saa_getorganebyid(7844,:RET_ORGANE);
     
    PL/SQL procedure successfully completed.
     
    SQL> print RET_CODE;
     
      RET_CODE
    ----------
             1
     
    SQL> print RET_ORGANE;
     
         EMPNO ENAME             SAL
    ---------- ---------- ----------
          7844 TURNER           1500
     
    SQL>

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Ne compile pas ...
    La proposition de remplacement de %ROWTYPE par SYS_REFCURSOR ne compile pas ...

    Message d'erreur = Erreur(9,85): PL/SQL: ORA-00947: nombre de valeurs insuffisant

    La ligne 9 contenant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    OPEN ORGANE FOR SELECT org.org_code, org.org_libelle, org.org_libelle INTO ORGANE FROM rfp_organe_org org WHERE org_code = ORG_ID;
    Je précise, à toute fin utile que je suis sous Oracle 11.2 et SQL Developer 3.2

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Revérifiez ma fonction, il n'y a pas besoin de INTO ORGANE.

    Par contre le langage appelant doit fermer le curseur, ici la méthode print de sqlplus ferme automatiquement le curseur après affichage, je ne crois pas que ce soit le cas de la méthode print de sqldeveloper.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Mauvaise lecture. Ca marche !
    Pardon, j'avais effectivement mal lu .
    Le code fonctionne, merci !

  7. #7
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par jdamas Voir le message
    ...Je reste intéressé par une solution "pure SQL" (toujours avec SQL Developper)
    RowType signifie Record! Et le type record est inconnue pour le "pure SQL"!
    Je suis toujours pour le "supplice du goudron et des plumes" à appliquer aux programmeurs concevant des fonctions ayant des paramètres Out en sortie.

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

Discussions similaires

  1. Fonction - Renvoyer une cellule vide
    Par rogerlette dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 23/07/2010, 12h34
  2. Réponses: 2
    Dernier message: 14/06/2010, 16h21
  3. Problème avec fonction renvoyant une "Nested Table"
    Par Sunchaser dans le forum PL/SQL
    Réponses: 4
    Dernier message: 20/05/2009, 18h19
  4. fonction renvoyant une matrice
    Par sub-0 dans le forum Débuter
    Réponses: 6
    Dernier message: 31/12/2008, 18h59
  5. Fonction renvoyant une string
    Par salseropom dans le forum C
    Réponses: 8
    Dernier message: 04/05/2006, 12h44

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