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 :

Variable globale de package pas mise à jour


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Variable globale de package pas mise à jour
    Bonjour,
    j'ai le problème suivant : j'ai un package (pkg_test) avec une variable globale (start_nl, de type DATE).
    Lorsque j'execute le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    execute pkg_test.start_nl :=sysdate
    Puis
    select pkg_test.get_start_nl from dual
    => La valeur a bien été affectée.

    Mais quand je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BEGIN 
        pkg_test.start_nl := to_date ('2009.05.01', 'YYYY.MM.DD');
    END;
    Puis de nouveau un SELECT de ma valeur, je constate que celle-ci n'a pas bougée. L'exécution s'est pourtant déroulée sans erreur.
    J'ai également créé une procédure dans le package qui permet de mettre à jour la variable (set_start_nl) mais ça ne change rien quand je l'appelle, la variable n'est pas mise à jour non plus.

    Je vois pas du tout d'où ça peut venir. Quelqu'un a-t-il une idée ?
    Merci d'avance,
    Cdlt.

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Bonjour,

    Est ce que tu peux envoyer ton code pour que les bénévoles puissent mieux t'aider ?

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    ok, ci-joint la création du package :
    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
    CREATE OR REPLACE PACKAGE PKG_THESEUSBI IS
       START_NL DATE;   
       FUNCTION get_start_nl RETURN DATE;
       PROCEDURE set_start_nl (start_nl_in IN DATE);
    END;
    /
     
    CREATE OR REPLACE PACKAGE BODY PKG_THESEUSBI
    IS
     
    FUNCTION get_start_nl RETURN DATE
       IS
       BEGIN
          RETURN START_NL;
       END;
     
       PROCEDURE set_start_nl (start_nl_in DATE)
       IS
       BEGIN
          START_NL := start_nl_in;
       END;
    END;
    /
    Ci-dessous l'affectation avec la procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    BEGIN 
        PKG_THESEUSBI.set_start_nl (sysdate());
    END;
    Je vérifie avec la fonction get_start_nl et malheureusement la variable reste à NULL :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT pkg_theseusbi.get_start_nl FROM dual

  4. #4
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Tu n'as pas besoin de la procedure ici

    Code sql : 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
     
     CREATE OR REPLACE PACKAGE PKG_THESEUSBI IS
       START_NL DATE;   
       FUNCTION get_start_nl (start_nl_in IN DATE) RETURN DATE;
      --- PROCEDURE set_start_nl (start_nl_in IN DATE);
    END;
    /
     
    CREATE OR REPLACE PACKAGE BODY PKG_THESEUSBI
    IS
     
    FUNCTION get_start_nl (start_nl_in IN DATE) RETURN DATE
       IS
       start_nl date;
       BEGIN
          START_NL := start_nl_in;
     
          return start_nl;
     
       END;
    END;
    /

    dans ce cas on n'a plus besoin du package ...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE OR REPLACE FUNCTION
            f_get_start_nl(start_nl_in DATE)
            RETURN DATE AS v_start_nl DATE;
            BEGIN
                    v_start_nl := start_nl_in ;
                    RETURN v_start_nl;
            END;
    /

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2003
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    oui c'est vrai que je peux me passer de la procédure et faire appel directement à la variable.
    Mon problème en fait, c'est que le BEGIN...END a sa propre session et sorti de celle-ci, les variables n'existent plus. C'est bien ça ? j'ai affiché la valeur après affectation et effectivement elle est bien renseignée tant qu'on est dans le BEGIN. Après non...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    BEGIN 
        PKG_THESEUSBI.set_start_nl (sysdate());
        dbms_output.put_line ('variable ' || PKG_THESEUSBI.START_NL);   
    END;
    Je pensais que la valeur de la variable globale persistait. Y-a-t-il un moyen pour que ce soit le cas ?
    si non, j'insérerai dans une table la valeur pour la récupérer ensuite.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    BEGIN 
        PKG_THESEUSBI.set_start_nl (sysdate());
        insert into test3 select PKG_THESEUSBI.START_NL from dual;
        commit;
    END;

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    316
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 316
    Points : 388
    Points
    388
    Par défaut
    essaye de fair precedé le nom de la variable par le nom du package
    dans le body.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    PKG_THESEUSBI.START_NL := start_nl_in;
    au lieu de 
    START_NL := start_nl_in;
     
    idem dans les autres proc / fonction

  7. #7
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Effectivement si tu sort d'un block les variables perdent leur valeurs

    Dans un but didactique ,
    Code sql : 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
     
     CREATE OR REPLACE PACKAGE PKG_THESEUSBI IS
       START_NL DATE;   
       FUNCTION get_start_nl (start_nl_in IN DATE) RETURN DATE;
      PROCEDURE set_start_nl (start_nl_in IN DATE);
    END;
    /
     
    CREATE OR REPLACE PACKAGE BODY PKG_THESEUSBI
    IS
     
    FUNCTION get_start_nl (start_nl_in IN DATE) RETURN DATE
       IS
       start_nl date;
       BEGIN
          START_NL := start_nl_in;
     
          RETURN start_nl;
     
       END;
     
     PROCEDURE set_start_nl (start_nl_in DATE)
       IS
       BEGIN
          START_NL := start_nl_in;
                  dbms_output.put_line('VARIABLE PROC RESULT : '||START_NL);
       END set_start_nl;
     
     
     
    END;
    /

    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
     
     
      DECLARE
              v_dt  DATE;
              v_res DATE;
      BEGIN
              v_dt  := SYSDATE ;
              v_res := PKG_THESEUSBI.get_start_nl(v_dt);
              dbms_output.put_line('FUNCTION RESULT :'
              ||v_res);
              PKG_THESEUSBI.set_start_nl(v_res);
      END;
    > /
    FUNCTION RESULT :07-AUG-09
    VARIABLE PROC: 07-AUG-09
     
    PL/SQL procedure successfully completed.

  8. #8
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Points : 6 446
    Points
    6 446
    Billets dans le blog
    1
    Par défaut /
    Bonjour,

    Ca marche avec execute .... mais pas avec begin ... end ?
    As-tu bien un message qui te dis que c'est exécuté avec succès dans les 2 cas ?

    avec begin ... end, il faut terminer par une ligne avec '/' pour l'exécuter.
    alros qu'avec execute, pas besoin. C'est sur une seule ligne alors sqlplus te la termine tout seul.

    Illustration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SQL> exec null
     
    PL/SQL procedure successfully completed.
     
    SQL> begin null; end;
      2  /
     
    PL/SQL procedure successfully completed.
    Cordialement,
    Franck.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/08/2008, 12h09
  2. Réponses: 0
    Dernier message: 05/03/2008, 17h16
  3. Les donnees ne sont pas mises à jour meme avec un refresh
    Par aymen007 dans le forum Hibernate
    Réponses: 5
    Dernier message: 11/10/2007, 16h20
  4. Réponses: 3
    Dernier message: 10/05/2007, 07h43
  5. debogage, form pas mise à jour
    Par LauBelette dans le forum Windows Forms
    Réponses: 7
    Dernier message: 25/02/2007, 09h18

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