这是我的表和价值观:
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;
答案 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已经存在,所以即使作为实验,这似乎也不是很有用。