2010-05-02 17 views
4

J'ai fait ce travail, qui devrait être exécuté dans un intervalle de 1 minute, mais cela ne fonctionne pas. Quand j'utilise execute dbms_job.run(2);, il est exécuté. printe est une procédure S'il vous plaît suggérer!Vous essayez de faire un travail à exécuter après chaque minute, mais cela ne fonctionne pas?

BEGIN 
    DBMS_JOB.SUBMIT (
     job =>:job_no, 
      WHAT=>'printe;',--Procedure 
      next_date=>sysdate+1/24*60, 
      interval=>'sysdate+1/24*60' 
     ); 
    commit; 
END; 
+1

Comment vérifiez-vous si la procédure est exécutée? Qu'est ce que ça fait? –

+2

Cet intervalle semble incorrect. Si vous voulez qu'il s'exécute toutes les minutes, l'intervalle ne devrait-il pas être 'SYSDATE + ((1/24)/60)'? Comme spécifié, je pense que ça va se répéter toutes les 60 heures. –

Répondre

4

Essayez next_date = sysdate + (24/01/60) et l'intervalle = (24/01/60) ...

+0

Ça ne fonctionne pas! – Vineet

4

Voici un emploi simple.

SQL> create table log1 (ts timestamp) 
    2/

Table created. 

SQL> create or replace procedure printe as 
    2 begin 
    3  insert into log1 values (systimestamp); 
    4  commit; 
    5 end; 
    6/

Procedure created. 

SQL> 

Donc, la première chose à faire est de le soumettre avec l'heure et l'intervalle de début correctement spécifiés. Si vous ne pouvez pas vous rappeler combien de minutes il y a dans une journée (1440), c'est une bonne idée d'utiliser des crochets. Comparons soumettre le travail avec vos spécifications date ...

SQL> var job_no number 
SQL> BEGIN 
    2  DBMS_JOB.SUBMIT 
    3  (
    4  job =>:job_no, 
    5  WHAT=>'printe;',--Procedure 
    6  next_date=>sysdate+1/24*60, 
    7 interval=>'sysdate+1/24*60' 
    8 ); 
    9 commit; 
    10 END; 
    11/

PL/SQL procedure successfully completed. 

SQL> print job_no 

    JOB_NO 
---------- 
     71 

SQL> 

... avec des crochets pour avoir préséance ...

SQL> BEGIN 
    2  DBMS_JOB.SUBMIT 
    3  (
    4  job =>:job_no, 
    5  WHAT=>'printe;',--Procedure 
    6  next_date=>sysdate+1/(24*60), 
    7 interval=>'sysdate+1/(24*60)' 
    8 ); 
    9 commit; 
10 END; 
11/

PL/SQL procedure successfully completed. 

SQL> print job_no 

    JOB_NO 
---------- 
     72 

SQL> 

Il est clair que l'emploi 71 n'a pas courir et ne va pas courir pendant un certain temps encore:

SQL> select job, what, last_date, next_date, interval 
    2 from user_jobs 
    3 where job in (71,72) 
    4/

    JOB WHAT   LAST_DATE   NEXT_DATE   INTERVAL 
------ ------------ -------------------- -------------------- ----------------- 
    71 printe;       05-MAY-2010 17:35:34 sysdate+1/24*60 
    72 printe;  03-MAY-2010 05:44:42 03-MAY-2010 05:45:34 sysdate+1/(24*60) 

SQL> 

travail de surveillance 72 ....

SQL> select * from log1 
    2/

TS 
------------------------------------------------------------------- 
03-MAY-10 05:43:39.250000 
03-MAY-10 05:44:42.296000 

SQL> 

Donc, si cela ne fonctionne toujours pas pour vous, que devriez-vous faire? La première chose à faire est de vérifier si la base de données est configurée pour exécuter des tâches. Vous aurez besoin d'un accès DBA pour cela.

SQL> select value 
    2 from v$parameter 
    3 where name='job_queue_processes' 
    4/

VALUE 
------------------------- 
1000 

SQL> 

Si je me souviens bien, dans Oracle 9i la valeur par défaut de ce paramètre est 0. Il doit être réglé à une valeur non nulle pour les travaux à exécuter.

Et si ce n'est pas le problème, vous devez vérifier les messages d'erreur dans le journal des alertes. Le répertoire background_dump_dest peut également avoir des fichiers .trc produits par un travail défaillant.

+0

Avec job_queue_processes, il y a aussi job_queue_interval, qui indique à quelle fréquence la base de données se réveille et recherche les tâches à exécuter. Vous en aurez besoin pour être inférieur à 60 secondes. –

+0

Je ne sais pas exactement quelle est la raison, mais dans mon cas, le travail fonctionne comme prévu pendant un certain temps, puis il ne suffit pas à la minute suivante. J'utilise Oracle 9i et le travail est programmé pour fonctionner toutes les minutes. – viveksinghggits

+0

@viveksinghggits - Je ne sais vraiment pas ce que vous attendez de moi. Il est assez difficile de diagnostiquer des erreurs intermittentes dans mon propre système où j'ai un accès complet. il n'y a aucune chance de faire quoi que ce soit avec un système distant aléatoire sans aucune information. – APC