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 :

Création d'un job avec paramètre use_current_session à true


Sujet :

SQL Oracle

  1. #1
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 13
    Par défaut Création d'un job avec paramètre use_current_session à true
    Sur Oracle 10.2.0.2

    Bonjour,
    À l'intérieur d'une procédure je fais la création d'un job qui va faire exécuter un shell script. Mon problème est que je veux que mon PL attende que le shell script soit terminé avant de continuer son code.

    J'ai alors mis le paramètre use_current_session = true, donc je m'attendais à ce qu'il continue l'exécution, mais voilà qu'il ne fait pas le reste du code. La vue DBA_SCHEDULER_RUN_JOB_DETAILS m'affiche que le job s'est bien déroulé. Pour être certain j'ai fait un update d'une table avant de faire run_job, et un update de la même table après le run_job. Le deuxième update ne fonctionne pas.

    Voici ma partie de code:
    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
           v2_NomJob := 'JOB'||TO_CHAR(Message.NO_REQUE);
           v2_Commentaire := Message.NOM_SCRIPT_EXEC||Message.COD_ENVIR||TO_CHAR(Message.NO_PHASE);
     
           v2_CmdSQL := 'UPDATE PARM_QUEUE'||
                        '   SET VAL_PARM = 1'||
                        ' WHERE COD_ENVIR = '''||Message.COD_ENVIR||''''||
                        '   AND NOM_PARM = ''NB_EN_COURS_'||Message.NOM_SCRIPT_EXEC||'''';
     
           EXECUTE IMMEDIATE v2_CmdSQL;
     
           COMMIT;
     
           DBMS_SCHEDULER.CREATE_JOB(job_name => v2_NomJob,
                                     job_type => 'EXECUTABLE',
                                     job_action => '/usr/bin/ksh',
                                     start_date => systimestamp at time zone '-5:00',
    								 number_of_arguments => 1,
                                     job_class => 'DEFAULT_JOB_CLASS',
                                     comments => v2_Commentaire,
                                     auto_drop => FALSE,
                                     enabled => FALSE);
     
           DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE(v2_NomJob, 1, '/HOME/oracle/doe '||TO_CHAR(Message.NO_REQUE));
     
           DBMS_SCHEDULER.SET_ATTRIBUTE(v2_NomJob, 'restartable', TRUE);
     
           DBMS_SCHEDULER.ENABLE(v2_NomJob);
     
           DBMS_SCHEDULER.RUN_JOB(v2_NomJob, use_current_session=> TRUE);
     
     
           v2_CmdSQL := 'UPDATE XD_PARM_QUEUE'||
                        '   SET VAL_PARM = 10'||
                        ' WHERE COD_ENVIR = '''||Message.COD_ENVIR||''''||
                        '   AND NOM_PARM = ''NB_EN_COURS_'||Message.NOM_SCRIPT_EXEC||'''';
     
           EXECUTE IMMEDIATE v2_CmdSQL;
     
           COMMIT;
    Merci!

  2. #2
    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 The Machin X Voir le message
    [U]...
    Pour être certain j'ai fait un update d'une table avant de faire run_job, et un update de la même table après le run_job. ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
           ...
           v2_CmdSQL := 'UPDATE PARM_QUEUE'||
    ...
           DBMS_SCHEDULER.RUN_JOB(v2_NomJob, use_current_session=> TRUE);
     
     
           v2_CmdSQL := 'UPDATE XD_PARM_QUEUE'||
    ...
    Merci!
    Juste une remarque: ça n'a pas l'air d'être la même table.

  3. #3
    Membre émérite Avatar de philcero
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 528
    Par défaut
    Pour moi il faut soit faire une boucle et checker l'état du JOB soit faire un job pour la suite des évènements et faire une chaîne dans le scheduler (Deux jobs), auquel cas Oracle enchaînera les jobs à la suite.

  4. #4
    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 philcero Voir le message
    Pour moi il faut soit faire une boucle et checker l'état du JOB soit faire un job pour la suite des évènements et faire une chaîne dans le scheduler (Deux jobs), auquel cas Oracle enchaînera les jobs à la suite.
    La doc dit

    The job can be run in two different modes. One is in the current user session. In this case, the call to RUN_JOB will block until it has completed the job. Any errors that occur during the execution of the job will be returned as errors to the RUN_JOB procedure. The other option is to run the job immediately like a regular job. In this case, RUN_JOB returns immediately and the job will be picked up by the coordinator and passed on to a job slave for execution. The Scheduler views and logs must be queried for the outcome of the job.


  5. #5
    Membre émérite Avatar de philcero
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2007
    Messages
    528
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2007
    Messages : 528
    Par défaut
    La doc dit :
    Multiple user sessions can use RUN_JOB in their sessions simultaneously when use_current_session is set to TRUE.
    Pour moi cela ne veut pas dire qu'il attend...

  6. #6
    Membre averti
    Inscrit en
    Juin 2004
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 13
    Par défaut
    Oui euh, désolé c'est la même table, j'ai seulement fait une erreur de frappe.

    De surcroît, mon PL est lancé via un callback sur une table de messages de l'AQ et lorsque je met le paramètre use_current_session à true, la QUEUE se retrouve dans la table des exceptions. À false, la QUEUE ne se retrouve pas en exception...

    Je vais régler ce problème qui me gruge trop de temps en gérant le reste dans mon shell script.

    La nuit a porté conseil.. Merci!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 31/01/2012, 09h01

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