2010-08-31 15 views
0

Lorsque ce code est exécuté dans SQL Developer contre Oracle 11g je reçois une erreur,Expliquer "ORA-01870: les intervalles ou datetimes ne sont pas comparables entre elles"

begin 
dbms_scheduler.create_job(
    job_name => 'comuni_34', 
    job_type => 'plsql_block', 
    job_action => 'begin com_auth_api.expire_old_passwords; end;', 
    start_date => to_date('2009-jan-01 01:15:00', 'yyyy-mon-dd hh24:mi:ss'), 
    repeat_interval => 'freq=daily', 
    enabled => true, 
    comments => 'Expire old passwords' 
); 
end; 

Ceci est l'erreur,

Error starting at line 4 in command: 
begin 
dbms_scheduler.create_job(
    job_name => 'comuni_34', 
    job_type => 'plsql_block', 
    job_action => 'begin com_auth_api.expire_old_passwords; end;', 
    start_date => to_date('2009-jan-01 01:15:00', 'yyyy-mon-dd hh24:mi:ss'), 
    repeat_interval => 'freq=daily', 
    enabled => true, 
    comments => 'Expire old passwords' 
); 
end; 
Error report: 
ORA-01870: the intervals or datetimes are not mutually comparable 
ORA-06512: at "SYS.DBMS_ISCHED", line 99 
ORA-06512: at "SYS.DBMS_SCHEDULER", line 268 
ORA-06512: at line 2 
01870. 00000 - "the intervals or datetimes are not mutually comparable" 
*Cause: The intervals or datetimes are not mutually comparable. 
*Action: Specify a pair of intervals or datetimes that are mutually 
      comparable. 

Une recherche sur Google n'a pas aidé car elle énumérait juste des tas de sites de code d'erreur Oracle inutiles. Peut-être que la source de SYS.DBMS_ISCHED/SYS.DBMS_SCHEDULER peut expliquer cela.

Mise à jour: Un travail différent qui utilise '2010-avr-20 01:15:00' au lieu de '2009-jan-01 01:15:00' vient de fonctionner peut-être le problème est que les dates qui sont trop loin dans le passé n'est pas géré correctement.

Mise à jour: L'utilisation de '2009-apr-01 01:15:00' au lieu de '2009-jan-01 01:15:00' vient de commencer. Cependant, '2009-mar-01 01:15:00' ne fonctionnait pas, il y a donc une limite à laquelle on peut commencer un travail. Depuis que j'ai résolu mon problème, je ne peux pas accepter une réponse qui est une répétition de ma solution, mais si quelqu'un veut expliquer cela plus loin, je vais envisager d'accepter cela.

+1

Sinon, vous pouvez poster vos mises à jour comme une réponse et accepter. La documentation ne spécifie pas de limite inférieure pour le START_DATE et votre explication semble assez raisonnable. – APC

Répondre

1

Je n'ai pas 11g pour le tester, mais sur une base de données 10.2.0.4 le CREATE_JOB a été couronné de succès avec START_DATE dès le 01-JAN-1970. Cela pourrait être un bug et vous voudrez peut-être vérifier sur Metalink si vous avez accès.

1

Je pense que vous avez le mauvais ensemble de paramètres NLS_LANG * dans votre session. SQL Developer le fait automatiquement. Essayez cet endroit au beginnig du script dans sqlplus:

ALTER SESSION SET NLS_LANGUAGE= 'AMERICAN'; 
ALTER SESSION SET NLS_TERRITORY= 'AMERICA'; 

Donc après essayez d'exécuter:

begin 
dbms_scheduler.create_job(
    job_name => 'comuni_34', 
    job_type => 'plsql_block', 
    job_action => 'begin com_auth_api.expire_old_passwords; end;', 
    start_date => to_date('2009-jan-01 01:15:00', 'yyyy-mon-dd hh24:mi:ss'), 
    repeat_interval => 'freq=daily', 
    enabled => true, 
    comments => 'Expire old passwords' 
); 
end; 
/
+0

Je viens d'avoir la même erreur lors de la création d'un travail, sans paramétrer start_date du tout depuis une boîte distante vers la base de données. J'ai essayé sur une autre session, connecté en tant que compte Oracle sur un nœud d'instance, et cela a fonctionné, donc je suspecte un problème lié à NLS. Besoin de confirmer. –

0

Vous pourriez envisager le comportement de la fonction OVERLAPS. Je ne sais pas si Scheduler utilise, mais le message d'erreur est le même:

SQL> select 1 from dual where (sysdate,sysdate+2) overlaps (sysdate+1,sysdate+5); 

     1 
---------- 
     1 

SQL> select 1 from dual where (null,sysdate+2) overlaps (sysdate+1,sysdate+5); 
     1 
---------- 
     1 

SQL> select 1 from dual where (sysdate+2,null) overlaps (sysdate+1,sysdate+5); 
     1 
---------- 
     1 

SQL> select 1 from dual where (null,null) overlaps (sysdate+1,sysdate+5); 
select 1 from dual where (null,null) overlaps (sysdate+1,sysdate+5) 

ORA-01870: the intervals or datetimes are not mutually comparable