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

SQL Oracle Discussion :

Appel une procédure d'une autre procédure


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Appel une procédure d'une autre procédure
    Bonjour,

    J'ai un package dans la quelle, j'ai écrit 2 procédures stockées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Procedure P1 
    IS
    Begin
        --Appel une autre procédure
        Procedure 2 (1);
    End P1
     
    Procedure P2 (a in number)
    IS
    Begin
       body P2....
    End P2
    Le problème est que quand je compile, il affiche pas d'erreurs et quand j'éxecute, il affiche:
    ORA-04063: package body "sss" comporte des erreurs
    ORA-06508: PL/SQL : unité de programme nommée : "sss" introuvable
    ORA-06512: à ligne 10

    Par contre, si j'écris le suivant, j'ai pas de problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Procedure P1 
    IS
    Begin
        body P2
    End P1
    Ce que je constate est qu'il y a un pb avec l'appel de la P2, ce que je ne comprends pas car quand j'écris directement le code dans la P1, cela fonctionne.

    Merci d'avance

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    le package specification contient bien les 2 ? Ce serait plus simple avec un vrai exemple

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    La "compilation" du package body travaille en séquentiel.
    --> premiere procedure trouvée = P1 qui contient un appel à P2 avec P2 un objet inconnu puisque le "compilateur" n'est pas encore "passé" sur P2 (qui se trouve après P1).

    Solution : inverser la définition, c'est-à-dire
    Procedure P2 (a IN number)
    IS
    Begin
    body P2....
    End P2

    Procedure P1
    IS
    Begin
    --Appel une autre procédure
    Procedure 2 (1);
    End P1

  4. #4
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    plalm a raison et c'est même une "erreur" typique de tout langage mais pas seulement pl/sql => juste permuter les places des fonctions, la fonction à utiliser dans l'autre en premier

    J'en profite pour demander aussi si on peut faire de la récursivité avec les procédures et fonctions PL/SQL ?

  5. #5
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    Sauf que la déclaration différenciée des headers et body permet gérer ce cas de figure....

  6. #6
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Oui mais en la mettant dans le header, on la rend aussi publique non ? Ce qui n'est pas forcément ce que l'on veut.

    Sinon pour répondre à randriano, oui on peut faire de la récursivité y compris sur une procédure/fonction qui n'est pas déclarée dans le header. Ainsi, une procédure peut s'appeler elle-même sans déclaration dans le header mais deux procédures qui s'appellent entre elles doivent être déclarée (ou au moins la deuxième dans le code) .

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Korfandar Voir le message
    Oui mais en la mettant dans le header, on la rend aussi publique non ? Ce qui n'est pas forcément ce que l'on veut.
    Oui je m'étais aussi confronté à ce problème...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Vicenzo a raison - la declaration est différencie - et cela n'a rien avoir avec le fait que la function/procedure soit public.

    Un petit exemple valant toujours mieux qu'un long discour ... avec
    + une function public qui affiche la surface d'un cercle
    + une function privée qui effectue la multiplication nécessaire
    create or replace package test_pkg as

    -- 'SIGNATURE PUBLIQUE' DES FUNCTIONS ET PROCEDURES
    function Tst01 (pRayon in number) return varchar2;

    end test_pkg;
    /

    create or replace package body test_pkg as

    -- 'SIGNATURE PRIVEE' DES FUNCTIONS ET PROCEDURES
    function Tst02 (pValue in number) return number;

    -- DEFINITION PREALABLE DES CONSTANTS
    cPi NUMBER := 3.14 ;

    -- DEFINITION DE Tst01
    -- L'ordre n'a plus d'importance la signature en debut
    -- de package body. Ici, Tst02 est connu
    function Tst01 (pRayon in number) return varchar2 is
    begin
    return 'La surface du cercle de rayon ' || pRayon || ' vaut ' || Tst02(pRayon);
    end Tst01;

    -- DEFINITION DE Tst02
    -- Il s'agit d'une definition stritement privee valide
    -- uniquement au sein de ce package body
    function Tst02 (pValue in number) return number is
    begin
    return cPi * power(pValue,2);
    end Tst02;

    end test_pkg;
    /
    En l'absence de la signature privée de la function Tst02, le package body est en erreur (c'est la question posée dans cette discussion).

    Dans l'exemple, la définition de Tst02 se fait uniquement dans le package body --> Tst02 n'est donc pas public ; la peuve

    SQL> desc test_pkg
    FUNCTION TST01 RETURNS VARCHAR2
    Argument Name Type In/Out Default?
    ------------------------------ ----------------------- ------ --------
    PRAYON NUMBER IN

  9. #9
    Membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2005
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2005
    Messages : 61
    Points : 57
    Points
    57
    Par défaut
    Ha d'accord, je n'avais pas du tout compris ce dont parlait Vicenzo. Merci pour ce cours, j'avais complètement zappé cette possibilité

  10. #10
    bruce-willis
    Invité(e)
    Par défaut
    plalm ! Peux-tu m'expliquer le truc de public/private en PL/SQL ?
    Le package n'est-il pas qu'une structure pour contenir des variables, des fonctions et des procédures mais pas comme une classe en P.O.O ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par bruce-willis Voir le message
    plalm ! Peux-tu m'expliquer le truc de public/private en PL/SQL ?
    Le package n'est-il pas qu'une structure pour contenir des variables, des fonctions et des procédures mais pas comme une classe en P.O.O ?
    Le package est constitué de deux parts dépendantes :
    1. le package qui contient la définition des functions/procedures qui pourront être exécutées directement ou appelée au sein d'un autre package par le owner lui-même (ou par un autre user - après nécessairement un GRANT EXECUTE). A cet endroit, la définition se limite à
      • donner un nom à la function/procedure

      • énumérer les paramètres utilisés avec leurs caractéristiques (nom, IN/OUT, type , valeur par défaut)

      En aucun cas, il n'y a ici l'indication de ce qui est réalisé (ni du comment) par la function/procedure - sauf via un éventuel commentaire (best practice) ; ceci doit être réalisé dans le package body.
      Par contre, le contenu du package peut être utilisé par les users qui possèdent le privilege execute sur le package : je les qualifie de public


    1. le package body qui contient
      • le code de chaque function/procedure définie dans le package

      • le code de toute autre function/procedure qui serait jugée utile par le développeur - c'est le cas de Tst02 dans mon exemple. Les functions/procedures ici définies ne peuvent être invoquées qu'au sein de ce seul package body ; je les qualifie de private


    La qualité de public/pivate est donc basée sur la portée de la dite function/procedure ... cela ne vous rappele-t-il pas quelque chose ?

    ==> Le package n'est pas qu'une structure de stockage des functions/procedures ; il facilite grandement la gestion de la sécurité.

  12. #12
    bruce-willis
    Invité(e)
    Par défaut
    Ah je comprends, le fait de déclarer Tst02 seulement dans package body le considère comme privé, utilisable seulement dans le package !
    Rien avoir avec la Programmation Orientée Objet don !!!

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par bruce-willis Voir le message
    Ah je comprends, le fait de déclarer Tst02 seulement dans package body le considère comme privé, utilisable seulement dans le package !
    Rien avoir avec la Programmation Orientée Objet don !!!
    Heu non rien à voir ! Il faut dire que la devise "Pensez objet, pensez Oracle" ne constitue pas non plus mon fond d'écran.

    Au plaisir.

  14. #14
    Membre habitué
    Profil pro
    Inscrit en
    Février 2006
    Messages
    139
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2006
    Messages : 139
    Points : 152
    Points
    152
    Par défaut
    Bonsoir,
    Moi je dirais au contraire que oui.
    Private et public ont la meme signification en java et en pl par exemple.
    Variable privée est en quelque sorte une variable locale au package ou à l'objet. Pour la manipuler depuis l'exterieur on peut utiliser une fonction public( getter et setter concept des beans)
    variable publique n'importe qui peut modifier la valeur de cette variable.

    C'est essentiel pour garantir la valeur d'une variable
    Cdt

  15. #15
    Membre éprouvé Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 904
    Points : 1 072
    Points
    1 072
    Par défaut
    Sauf qu'à mon sens, manquent l'héritage et le polymorphisme !
    .

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 18
    Points : 21
    Points
    21
    Par défaut
    Citation Envoyé par plalm Voir le message
    La qualité de public/pivate est donc basée sur la portée de la dite function/procedure ... cela ne vous rappelle-t-il pas quelque chose ?
    Lorsque j'ai écrit cela, c'était un clin d'oeil au langage C (d'autres aussi) qui gère de manière similaire la portée des variables. Est-ce que C est OO ? Cette qualité est-elle suffisante pour définir un langage OO ?

    Il manquerait alors quelque chose pour accéder au titre de langage objet ? Star a déjà répondu à cette dernière énigme.

  17. #17
    Membre expérimenté
    Avatar de randriano
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 219
    Points : 1 438
    Points
    1 438
    Par défaut
    OK plalm !!!

Discussions similaires

  1. Réponses: 7
    Dernier message: 25/03/2011, 10h52
  2. [XL-2002] Macro de comparaison d'une cellule d'une feuille avec une cellule d'une autre feuille.
    Par steelydan dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/09/2010, 12h59
  3. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  4. [XL-2007] Afficher une checkbox dans une feuille si une checkbox d'une autre feuille est cochée
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/08/2009, 13h35
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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