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 :

DBMS_SCHEDULER.create_job : utiliser une variable dans le champ job_action


Sujet :

PL/SQL Oracle

  1. #1
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut DBMS_SCHEDULER.create_job : utiliser une variable dans le champ job_action
    Bonjour,

    Je fais des tests en ce moment en PL/SQL et je suis très embêté avec le package DBMS_SCHEDULER. J'essaye d'insérer dans une table la valeur SYSDATE avec un format comportant heures, minutes et secondes. Pour cela je fais un select sysdate from dual avec le bon format, je stocke le résultat dans une variable et c'est là que les ennuis commencent.

    Voici le code de mon fichier .sql :
    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
    set serveroutput on
    DECLARE
    var_s_sysdate VARCHAR2(50);
    BEGIN
     
    select to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') INTO var_s_sysdate from dual;
    -- dbms_output.put_line('DATE = '||var_s_sysdate);
     
    DBMS_SCHEDULER.DROP_JOB('PLSQL04');
     
    DBMS_SCHEDULER.CREATE_JOB(
    job_name           => 'PLSQL04',
    job_type           => 'PLSQL_BLOCK',
    job_action         => 'insert into util1.essai values (var_s_sysdate) ;',
    repeat_interval => 'FREQ=SECONDLY;INTERVAL=10');
     
    END;
    /
    J'utilise dbms_output.put_line pour être sur que la variable est bien formatée : c'est OK.
    J'ai ensuite activé le job comme le prouve la commande ci-dessous : les variables ENABLE et STATE sont bien renseignées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> select JOB_NAME, JOB_ACTION, ENABLED, STATE, REPEAT_INTERVAL from USER_SCHEDULER_JOBS where job_name = 'PLSQL04';
    
    JOB_NAME
    ------------------------------
    JOB_ACTION
    --------------------------------------------------------------------------------
    ENABL STATE
    ----- ---------------
    REPEAT_INTERVAL
    --------------------------------------------------------------------------------
    PLSQL04
    insert into util1.essai values (var_s_sysdate) ;
    TRUE  SCHEDULED
    FREQ=SECONDLY;INTERVAL=10
    MAIS quand je fais un select * from util1.essai, je n'ai rien...
    Je pense que le problème vient du fait que j'utilise une variable dans le paramètre job_action.
    job_action => 'insert into util1.essai values (var_s_sysdate) ;',


    Voilà, si vous avez des idées, je suis preneur :-)
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    'insert into util1.essai values (var_s_sysdate) ;' C'est une chaine de caractère, donc ce qu'il y a à l'intérieur n'est jamais évalué.
    Il faudrait que tu mettes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'insert into util1.essai values (''' || var_s_sysdate ||''') ;'
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    OK, je ne connaissais pas cette syntaxe; un gros merci à toi McM.

    Bon, ben j'ai encore un souci

    Dans mon code précédent, la valeur sysdate était bien formatée mais toutes les 10 secondes c'était LA MEME valeur qui était insérée dans la table util1.essai : le job a été créé visiblement avec une valeur en dur récupérée par le select.
    Je décide donc de mettre un select dans l'INSERT pour que, chaque fois que le job s'exécute, il fasse un select de sysdate et que je sois content

    Manque de chance, ma table est vide alors que le job tourne bien...
    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
     
    DECLARE
    var_s_sysdate VARCHAR2(50);
    BEGIN
     
    DBMS_SCHEDULER.DROP_JOB('PLSQL01');
     
    DBMS_SCHEDULER.CREATE_JOB(
    job_name           => 'PLSQL01',
    job_type           => 'PLSQL_BLOCK',
    job_action         => 'insert into util1.essai values(select to_char(sysdate, ''DD-MON-YYYY HH24:MI:SS'') INTO var_s_sysdate from dual);',
    repeat_interval => 'FREQ=SECONDLY;INTERVAL=10',
    enabled            => TRUE);
     
    END;
    /

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SQL> select job_name, RUN_COUNT from ALL_SCHEDULER_JOBS where JOB_NAME like '%PLSQL%';
     
    JOB_NAME                        RUN_COUNT
    ------------------------------ ----------
    PLSQL01                                 9
     
    SQL> select * from util1.essai;
     
    no rows selected
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je pense que tu mélanges un peu tout.
    Un job exécute juste du pl/sql.
    La procédure DBMS_SCHEDULER.CREATE_JOB permet de créer un job qui va exécuter du code PL/SQL tous les X temps

    Donc toute cette partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set serveroutput on
    DECLARE
    var_s_sysdate VARCHAR2(50);
    BEGIN
     
    select to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') INTO var_s_sysdate from dual;
    ne sera jamais exécutée par le job


    Continuons : Le code action : Il DOIT pouvoir être exécuté sans erreur sous SQL+ :
    Cet insert plante à cause du INTO, du select dans le values
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into util1.essai values(select to_char(sysdate, ''DD-MON-YYYY HH24:MI:SS'') INTO var_s_sysdate from dual);
    Code à mettre pour insérer la date en format texte à chaque lancement du job
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into util1.essai values(to_char(sysdate, ''DD-MON-YYYY HH24:MI:SS''))
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre émérite
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    1 993
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 1 993
    Points : 2 499
    Points
    2 499
    Par défaut
    Bonjour McM, je te remercie à nouveau pour tes conseils!

    Je vois que tu es "Expert Confirmé Sénior" , bravo, j'espère arriver un jour à ce niveau car pour le moment je galère pas mal MAIS je m'accroche
    DBA Oracle
    Rédacteur du blog : dbaoraclesql.canalblog.com

Discussions similaires

  1. Additionner une variable dans un champ
    Par jeanfi77 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/02/2007, 15h08
  2. [VBA-E]Utiliser une variable dans une formule
    Par bossu dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 04/06/2006, 15h25
  3. Probléme pour insérer une variable dans un champs
    Par BOUTRAIS dans le forum Access
    Réponses: 2
    Dernier message: 11/04/2006, 22h45
  4. [FLASH MX2004] Utiliser une variable dans le code
    Par arnolem dans le forum Flash
    Réponses: 25
    Dernier message: 02/12/2005, 16h37
  5. Réponses: 3
    Dernier message: 27/07/2005, 15h12

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