Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 11h04   #1
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
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.
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h36   #2
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

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

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
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 :
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 :
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;
/
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h41   #3
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
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.
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 11h41   #4
Rédacteur
 
Inscription : décembre 2002
Messages : 2 385
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 385
Points : 3 263
Points : 3 263
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/
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 11h49   #5
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
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é.
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 24/05/2011, 11h58   #6
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

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

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
L'initialisation ne se déclenche bien qu'une seule fois. La preuve par l'exemple:
Code :
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.
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 12h05   #7
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
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.
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h12   #8
Membre éprouvé
 
Avatar de xdescamp
 
Homme Xavier Descamps
Inscription : octobre 2008
Messages : 297
Détails du profil
Informations personnelles :
Nom : Homme Xavier Descamps
Âge : 36
Localisation : France, Nord (Nord Pas de Calais)

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

Informations forums :
Inscription : octobre 2008
Messages : 297
Points : 422
Points : 422
Envoyer un message via Skype™ à xdescamp
Si tu quittes SQL*Plus pour te reconnecter ensuite, alors effectivement il réinitialise le package pour la nouvelle session.
xdescamp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h33   #9
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
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?
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h46   #10
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Tu peux aussi utiliser le context ou simplement initialiser la variable sur un trigger ON-CONNECT
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 15h50   #11
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
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?.
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h33   #12
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Tu peux faire un truc du genre :

Code :
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 :
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 :
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h55   #13
Membre du Club
 
Inscription : décembre 2010
Messages : 190
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 190
Points : 60
Points : 60
ok, merci je vais tester tout ça...
AbouZaid est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h52   #14
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par AbouZaid Voir le message
le context se base aussi sur la session du coup je perdrais sa valeur d'origine...
Citation:
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h09.


 
 
 
 
Partenaires

Hébergement Web