执行dbms_scheduler.create_job时“获得有效月份”?

时间:2016-01-14 18:09:33

标签: oracle oracle11g oracle-sqldeveloper

这是我的表和价值观:

CREATE TABLE Individuo
(
  id_ind int primary key,
  nom_ind Varchar(255),
  ape_ind Varchar(255),
  usr_ind Char(10)
)

DROP table Individuo;

insert into Individuo values(1, 'Carlos', 'Guzman', 'CG92');
insert into Individuo values(2, 'Hidalgo', 'Machado', 'HM88');
insert into Individuo values(3, 'Guillermo', 'Pinto', 'GP68');
insert into Individuo values(4, 'Katia', 'Barba', 'KB87');
insert into Individuo values(5, 'Fernando', 'Parra', 'FP77');
insert into Individuo values(6, 'Celesta', 'Valdes', 'CV');
insert into Individuo values(7, 'Carola', 'Vallez', 'CV92');
insert into Individuo values(8, 'Catalina', 'Riveron', 'CR75');
insert into Individuo values(9, 'Pepe', 'Najarro', 'PN83');
insert into Individuo values(10, 'Paz', 'Cuenca', 'PC74');
insert into Individuo values(11, 'Benedicto', 'Moscoso', 'BM92');
insert into Individuo values(12, 'Rosaline', 'Davila', 'RD88');
insert into Individuo values(13, 'Hector', 'Castellon', 'HC83');
insert into Individuo values(14, 'Leonora', 'Basco', 'LB80');

我正在oracle 11g express创建一份工作,我收到的错误是:“不是一个有效的月份”。我的开始日期格式有什么问题?

如果我希望我的工作永远执行,并且我需要自动增加插入值以使作业能够正常工作,我还想知道结束日期是否应该包含单词“Null”。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name             => 'mi_trabajo',
   job_type             => 'PLSQL_BLOCK',
   job_action           => 'INSERT INTO Individuo VALUES(15, "Beatriz", "Armando", "BA79");',
   start_date           => '14-JAN-16 14.00.00 PM America/Bogota',
   repeat_interval      => 'FREQ=DAILY;BYMINUTE=0,5,10,15,20,25,30,35,40,45,50,55', 
   end_date             => 'Null',
   enabled              =>  TRUE,
   comments             => 'La insercion en la tabla Individuo tuvo exito');
END;

1 个答案:

答案 0 :(得分:2)

开始日期的程序expects a timestamp with timezone。你正在传递一个字符串。因此,您依赖于该字符串的隐式转换,这取决于您的NLS设置。

从错误中看,您的NLS_LANGUAGE设置为英语,但您的NLS_DATE_LANGUAGE设置为其他内容,可能是您正在使用的时区的西班牙语。我可以用以下方法模拟错误:

select to_timestamp_tz('14-JAN-16 14.00.00 PM America/Bogota',
  'DD-MON-RR HH24.MI.SSXFF TZR',
  'NLS_DATE_LANGUAGE=SPANISH')
from dual;

SQL Error: ORA-01843: not a valid month

首先,您应该将字符串显式转换为正确的类型,而不是依赖于隐式转换:

to_timestamp_tz('14-JAN-16 14.00.00 PM America/Bogota',
  'DD-MON-RR HH:MI:SS PM TZR')

...除了你在使用AM / PM指示器时不能将小时设为'14':

to_timestamp_tz('14-JAN-16 02.00.00 PM America/Bogota',
  'DD-MON-RR HH:MI:SS PM TZR')

to_timestamp_tz('14-JAN-16 14.00.00 America/Bogota',
  'DD-MON-RR HH24:MI:SS TZR')

仍然依赖于您的NLS_DATE_LANGUAGE为英语,否则将无法识别JAN。您可以改为使用'ENE'(坚持使用西班牙语),和/或您可以在通话中包含日期语言:

to_timestamp_tz('14-JAN-16 14.00.00 PM America/Bogota',
  'DD-MON-RR HH24.MI.SSXFF TZR',
  'NLS_DATE_LANGUAGE=ENGLISH')

但最好使用月份数字以避免歧义,如果你这样做,你也可以使用四位数年份,例如:

to_timestamp_tz('2016-01-14 14:00:00 America/Bogota',
  'YYYY-MM-DD HH24:MI:SS TZR')

或者既然你走得那么远,请使用timestamp with time zone literal

timestamp '2016-01-14 14:00:00 America/Bogota'

在你的电话会议中:

...
start_date => timestamp '2016-01-14 14:00:00 America/Bogota',
...

正如@MichaelBroughton指出的那样,end_date不应该有引号 - 你传递的是一个无效的字符串(我认为这将使用隐式格式掩码获得ORA-01858)。仅使用end_date => null,或根本不通过。

你的工作行为有一个无效的插入声明;你在你正在使用的值周围使用了双引号,这意味着它们将被视为标识符 - 并且它们不存在。如果它运行,您应该看到错误(在user_scheduler_job_run_details中)。你可能想要绕过值的单引号 - 这是两个单引号('')而不是双引号("):

job_action => 'INSERT INTO Individuo (id_ind, nom_ind, ape_ind, usr_ind) VALUES(15, ''Beatriz'', ''Armando'', ''BA79'');',

无论如何它都会在第二次运行时失败,因为主键15已经存在,所以即使作为实验,这似乎也不是很有用。