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 :

Ecrire et compiler une procédure stockée à l'intérieur d'une procédure stockée ?


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut Ecrire et compiler une procédure stockée à l'intérieur d'une procédure stockée ?
    Bonjour,
    Est-il possible d'écrire et compiler une procédure stockée à l'intérieur d'une procédure stockée ?
    Merci pour votre réponse,

  2. #2
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Vous voulez parler des procédures locales déclarées au sein d'une procédure et visible uniquement de cette procédure ?

  3. #3
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Citation Envoyé par Scriuiw Voir le message
    Vous voulez parler des procédures locales déclarées au sein d'une procédure et visible uniquement de cette procédure ?
    Bonjour,
    Je ne connais pas le nom en particulier. Pouvez-vous me pointer vers un lien me donnant la syntaxe pour déclarer de telles procédures locales s'il vous plaît ?
    En fait j'ai un script scriptA qui appelle un très grand nombre de fois une procédure stockée procB. Et j'ai besoin d'une petite procédure stockée de log (qui fait une insertion dans une table) qui sera utilisée à la fois dans scriptA et dans procB. Ce scriptA ne sera utilisé que très peu de fois et je ne veux donc pas créer de manière prolongée une procédure de log qui ne sert qu'à ce cas.
    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
    scriptA:
    declare
        res number;
        errorText varchar2(32767);
    begin
        if (exists(select 1 from ALL_OBJECTS where object_type = 'TABLE' and OBJECT_NAME='logs'))
        begin
            drop table logs;
        else
            create table logs (id number not null, texte varchar2(4000));
        end if;
     
        procB(1, 'toto', res, errorText);
        if res != 0 then
            insert_log('UPDID ' || To_Char(1) || ' - ' || 'An error occured : ''' || errorText || '''');
        else
            insert_log('UPDID ' || To_Char(1) || ' - ' || 'DONE');
        end if;
    --100.000 times the same piece of code repeated calling procB and analysing its result
     
        select * from logs
        drop table logs;
    end;
    Je cherche à savoir où et comment je peux déclarer la procédure insert_log afin d'y avoir accès dans scriptA et dans procB mais qu'il ne reste rien d'autre après l'appel de sciptA dans la base que ma procédure stockée procB.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create sequence sLogId nocache;
    create table logs (id number not null, texte varchar2(4000));
    create or replace procedure insert_log (vLog IN VARCHAR2) as
      PRAGMA AUTONOMOUS_TRANSACTION;
    begin
      insert into logs values (sLogId.nextval, vLog);
      commit;
    end;
    Merci pour votre retour,

  4. #4
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Voici un exemple de procédure locale :
    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
     
    DECLARE -- declare variables and subprograms
      fname    VARCHAR2(20) := 'randall';
      lname    VARCHAR2(25) := 'dexter';
     
    -- declare a local procedure which can only be used in this block
      PROCEDURE upper_name ( v1 IN OUT VARCHAR2, v2 IN OUT VARCHAR2) AS
        BEGIN
          v1 := UPPER(v1); -- change the string to uppercase
          v2 := UPPER(v2); -- change the string to uppercase
        END upper_name;
     
    -- start of executable part of block
    BEGIN
      DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display initial values
      upper_name (fname, lname); -- call the procedure with parameters
      DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display new values
    END;
    /

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    415
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 415
    Points : 138
    Points
    138
    Par défaut
    Merci. En reprenant votre exemple où j'ai rajouté l'appel à une procédure stockée procB, est-ce que procB peut utiliser également la procédure upper_name ? Et si ce n'est pas le cas, y a-t-il un moyen d'arriver à faire cela ?
    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
    DECLARE -- declare variables and subprograms
      fname    VARCHAR2(20) := 'randall';
      lname    VARCHAR2(25) := 'dexter';
     
    -- declare a local procedure which can only be used in this block
      PROCEDURE upper_name ( v1 IN OUT VARCHAR2, v2 IN OUT VARCHAR2) AS
        BEGIN
          v1 := UPPER(v1); -- change the string to uppercase
          v2 := UPPER(v2); -- change the string to uppercase
        END upper_name;
     
    -- start of executable part of block
    BEGIN
      DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display initial values
      upper_name (fname, lname); -- call the procedure with parameters
    procB();--is there a way procB can use upper_name(...,...) ?
      DBMS_OUTPUT.PUT_LINE(fname || ' ' || lname ); -- display new values
    END;
    /

  6. #6
    Membre chevronné
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Points : 1 878
    Points
    1 878
    Par défaut
    Non, la procédure "upper_name" n'est visible que dans le bloc DECLARE et aucunement d'autres procédures externes à ce bloc.

    Sinon vous créez un package avec votre procédure de trace et votre script A en rendant visibles les deux des objets externes (Packages, procédures, fonctions, triggers, etc...)

Discussions similaires

  1. Procédures stockées à l'intérieur d'une transaction
    Par SergioMaster dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2014, 07h17
  2. Réponses: 2
    Dernier message: 21/02/2013, 19h54
  3. Réponses: 2
    Dernier message: 16/02/2007, 18h49
  4. Réponses: 7
    Dernier message: 06/11/2006, 16h18
  5. Réponses: 2
    Dernier message: 10/12/2004, 15h43

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