执行 dbms_scheduler.create_job 时得到 "not a valid month"?
Getting "not a valid month" when executing a dbms_scheduler.create_job?
这是我的 table 和值:
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 中创建作业,但收到一条错误消息:"not a valid month"。我的开始日期格式有什么问题?
我还想知道结束日期是否应该包含 "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;
程序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'
(坚持使用西班牙语),and/or 您可以在通话中包含日期语言:
to_timestamp_tz('14-JAN-16 14.00.00 PM America/Bogota',
'DD-MON-RR HH24.MI.SSXFF TZR',
'NLS_DATE_LANGUAGE=ENGLISH')
但最好使用月份数字来避免歧义,如果你这样做,你也可以使用 four-digit 年,例如:
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,
或根本不传递它。
并且您的作业操作包含无效的插入语句;您在所使用的值周围使用了 double-quotes ,这意味着它们将被视为标识符 - 它们不存在。如果它 运行s 你应该看到错误(在 user_scheduler_job_run_details
中)。您可能打算在值周围转义 single-quotes - 这是两个单引号 (''
) 而不是双引号 ("
):
job_action => 'INSERT INTO Individuo (id_ind, nom_ind, ape_ind, usr_ind) VALUES(15, ''Beatriz'', ''Armando'', ''BA79'');',
它会在第二个 运行 失败,因为主键 15 已经存在,所以即使作为实验,这似乎也不是很有用。
这是我的 table 和值:
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 中创建作业,但收到一条错误消息:"not a valid month"。我的开始日期格式有什么问题?
我还想知道结束日期是否应该包含 "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;
程序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'
(坚持使用西班牙语),and/or 您可以在通话中包含日期语言:
to_timestamp_tz('14-JAN-16 14.00.00 PM America/Bogota',
'DD-MON-RR HH24.MI.SSXFF TZR',
'NLS_DATE_LANGUAGE=ENGLISH')
但最好使用月份数字来避免歧义,如果你这样做,你也可以使用 four-digit 年,例如:
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,
或根本不传递它。
并且您的作业操作包含无效的插入语句;您在所使用的值周围使用了 double-quotes ,这意味着它们将被视为标识符 - 它们不存在。如果它 运行s 你应该看到错误(在 user_scheduler_job_run_details
中)。您可能打算在值周围转义 single-quotes - 这是两个单引号 (''
) 而不是双引号 ("
):
job_action => 'INSERT INTO Individuo (id_ind, nom_ind, ape_ind, usr_ind) VALUES(15, ''Beatriz'', ''Armando'', ''BA79'');',
它会在第二个 运行 失败,因为主键 15 已经存在,所以即使作为实验,这似乎也不是很有用。