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 :

Variable Global dans un Package


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut Variable Global dans un Package
    bonjour à tous,

    Voilà, j'ai un Package pl/sql qui comporte plusieurs Procédures.

    Je voudrais utiliser une variable Globale pour tout le package et l'appeler depuis mes procédures avec sa valeur initiale.

    J'ai pu créer la variable dans les SPEC du package, mais impossible d'initialiser sa valeur pour toutes les procédures.

    Une idée??

    Merci.

  2. #2
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Bonjour,

    L'initialisation de la variable se fait au chargement du package, pas à l'appel d'une procédure. C'est-à-dire qu'elle sera initialisée au moment du premier appel à l'une des procédures, mais ne sera plus initialisée ensuite. Si la procédure modifie cette variable, elle gardera la valeur modifiée.

    Pour l'initialisation, soit c'est une constante, et tu peux le mettre dans la déclaration de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Create or replace package mon_pkg is
    ...
      ma_variable varchar2(10) := 'ma_valeur';
    ...
    Soit le code est plus complexe, et tu peux utiliser un bloc PL/SQL pour l'initialiser dans le corps du package body :
    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
    Create or replace package mon_pkg is
    ...
      ma_variable varchar2(10);
    ...
    End mon_pkg;
    /
     
    Create or replace package body mon_pkg is
      Procedure proc1 (...)
      End proc1;
      ...
    Begin
      -- Du code permettant de récupérer la valeur d'initialisation
      ...
      ma_variable := ...;
      ...
    End mon_pkg;
    /

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    salut et merci de ton aide.

    En fait j'ai déjà fait comme tu viens de me dire dans le second cas, mais j'ai remarqué qu'à chaque fois qu'une procedure se lance et bien elle fait appel à l'initialisation de la variable.

    Je voudrais plutôt que l'initialisation se fasse une et une seule fois dans tout le package.

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Et encore une victime du syndrome de la boule de cristal !

    Comment espérez-vous qu'on puisse vous aider quand vous ne fournissez ni votre code source ni les erreurs rencontrées ?
    De plus, préciser sa version d'Oracle et le système d'exploitation doit être un réflexe quand on pose une question dans le forum.

    En omettant ces informations, vous découragez toutes les bonnes volontés, nombreuses ici, qui sont prêtes à vous aider mais n'ont ni le temps ni la patience de vous tirer les vers du nez.

    Et pour faire bonne mesure : http://www.developpez.net/forums/d28...s-lire-poster/

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Peu être que vous avez raison, mais xdescamp m'a bien compris, car je pense que ma question est toute simple.

    Je n'ai pas jugé important de préciser la version d'oracle ni le code ( puisque je n'ai pas encore de code!! ), mais bon, j'utilise la version 10G.

    Sinon pour le code, c'est exactement celui de xdescamp de j'ai essayé.

  6. #6
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    L'initialisation ne se déclenche bien qu'une seule fois. La preuve par l'exemple:
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    SQL> create or replace package mon_pkg is
      2    ma_variable varchar2(10);
      3    procedure p1;
      4    procedure p2;
      5  end mon_pkg;
      6  /
     
    Package créé.
     
    SQL> create or replace package body mon_pkg is
      2    procedure p1 is
      3    begin
      4      dbms_output.put_line ('Ici P1');
      5    end p1;
      6  
      7    procedure p2 is
      8    begin
      9      dbms_output.put_line ('Ici P2');
     10    end p2;
     11  
     12  begin
     13    dbms_output.put_line ('Initialisation');
     14    ma_variable := 'ma_valeur';
     15  end mon_pkg;
     16  /
     
    Corps de package créé.
     
    SQL> set serveroutput on
    SQL> exec mon_pkg.p1;
    Initialisation
    Ici P1
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> exec mon_pkg.p1;
    Ici P1
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> exec mon_pkg.p2;
    Ici P2
     
    Procédure PL/SQL terminée avec succès.
     
    SQL>
    Il faut bien entendu rester dans la même session, les valeurs des variables globales étant affectées à la session.

  7. #7
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Ah oui, c'est vrai, en fait j'appelle la première procédure ensuite je fais un sql*loader puis j'appelle la 2ème procédure. Donc je crois que la variable s'initialise 2 fois à cause de sql*loader.

  8. #8
    Membre chevronné Avatar de xdescamp
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 300
    Par défaut
    Si tu quittes SQL*Plus pour te reconnecter ensuite, alors effectivement il réinitialise le package pour la nouvelle session.

  9. #9
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Donc si je veux que mon information reste inchangée, je dois obligatoirement utiliser une table?

    N'y a t il pas un autre moyen?

  10. #10
    Expert éminent
    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
    Par défaut
    Tu peux aussi utiliser le context ou simplement initialiser la variable sur un trigger ON-CONNECT

  11. #11
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    le context se base aussi sur la session du coup je perdrais sa valeur d'origine...

    Sinon pour le trigger, je peux le faire depuis un package? même si je change de session?.

  12. #12
    Expert éminent
    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
    Par défaut
    Tu peux faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create or replace trigger trg_no_sys_logon
    after logon
    on database
    begin
      pkg_context.set_value;
    end;
    /
    Avec le package comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE package pkg_context IS
    context_value varchar2(10);
    procedure set_value;
    function get_value return varchar2;
    end pkg_context;
    /
    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 package body pkg_context IS
    procedure set_value IS
    begin
        context_value := 'ma_valeur';
    end;
     
    function get_value return varchar2 IS
    begin
        return context_value;
    end;
    end pkg_context;
    /
    En principe, au logon ta variable pkg_context.context_value aura la valeur définie dans le package.

    En espérant avoir compris le besoin

  13. #13
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    ok, merci je vais tester tout ça...

  14. #14
    Expert confirmé 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
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    le context se base aussi sur la session du coup je perdrais sa valeur d'origine...
    ACCESSED GLOBALLY

    This clause indicates that any application context set in namespace is accessible throughout the entire instance. This setting lets multiple sessions share application attributes.

Discussions similaires

  1. Réponses: 3
    Dernier message: 14/05/2009, 17h53
  2. Initialisation des variables globales dans un package
    Par fred_hte_savoie dans le forum SQL
    Réponses: 2
    Dernier message: 17/04/2007, 10h26
  3. Variables globales dans une classe
    Par vanitom dans le forum C++
    Réponses: 16
    Dernier message: 14/01/2005, 14h40
  4. Variables globales dans fichiers entête
    Par benj_f04 dans le forum C++
    Réponses: 5
    Dernier message: 13/08/2004, 09h06
  5. Variable "globale" (dans plusieurs templa
    Par mattmat dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 17/06/2003, 19h22

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