Oracle 获得;不是有效月份”;执行dbms_调度程序时。是否创建_作业?

Oracle 获得;不是有效月份”;执行dbms_调度程序时。是否创建_作业?,oracle,oracle11g,oracle-sqldeveloper,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, 'Hid

这是我的表和值:

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');
我在Oracle11gExpress中创建了一个作业,我收到一个错误,上面写着:“不是有效月份”。我的开始日期格式有什么问题

我还想知道如果我希望我的作业永远执行,结束日期是否应该有“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;
开始日期的过程。你在传递一个字符串。因此,您依赖于该字符串的隐式转换,这取决于您的NLS设置

从错误中可以看出,您的NLS_语言设置为英语,但NLS_日期_语言设置为其他语言,可能是您使用的时区的西班牙语。我可以用以下方法模拟错误:

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')

这仍然依赖于你的NLS_DATE_语言是英语,否则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')
或者,既然你已经走了那么远,就用:

在您的通话中,这将是:

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

正如@Michaelbrowton所指出的,
结束日期
不应该有引号-你传递的是一个无效的字符串(我认为这将得到带有隐式格式掩码的ORA-01858)。只使用
end\u date=>null、
或根本不传递它


并且您的作业操作具有无效的insert语句;您在所使用的值周围使用了双引号,这意味着它们将被视为标识符,并且它们不存在。如果它运行,您应该会看到错误(在
用户\计划程序\作业\运行\详细信息
中)。您可能想在值周围转义单引号-这是两个单引号(
'
),而不是双引号(
):

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

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

从错误中可以看出,您的NLS_语言设置为英语,但您的NLS_日期_语言设置为其他语言,可能是您使用的时区的西班牙语。我可以用以下方法模拟错误:

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')

这仍然取决于您的NLS_DATE_语言为英语,否则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')
或者,既然你已经走了那么远,就用:

在您的通话中,这将是:

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

正如@Michaelbrowton所指出的,
end\u date
不应该在它周围加引号-你传递的是一个无效的字符串(我认为这将通过你的隐式格式掩码得到ORA-01858)。只使用
end\u date=>null,
或者根本不传递它


并且您的作业操作具有无效的insert语句;您在所使用的值周围使用了双引号,这意味着它们将被视为标识符,并且它们不存在。如果它运行,您应该会看到错误(在
用户\u计划程序\u作业\u运行\u详细信息
中)。您可能想在值周围转义单引号-这是两个单引号(
),而不是双引号(
):


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

1)您的NLS设置可能没有正确地在开始日期格式上执行隐式的结束日期,所以请将其放入到结束日期()函数中。第2项)删除结束日期空值附近的引号。您需要将其设置为null,而不是包含null一词的字符串。使用
start\u date=>SYSTIMESTAMP
-这更简单。1)您的NLS设置可能无法正确执行start\u date格式的隐式to\u date,因此请将其放入to\u date()函数中。第2项)删除结束日期空值附近的引号。您需要将其设置为null,而不是包含null一词的字符串。使用
start\u date=>SYSTIMESTAMP
-这更简单。结束日期引用的null也可能是导致隐式formatting@MichaelBroughton-是的,的确,我没有发现有人引用了这句话。虽然我的NLS_TIMESTAMP_TZ_格式设置为OP似乎使用的相同模式,
to_TIMESTAMP_TZ('NULL')
获得ORA-01858。是的,我没有注意到下午14点,所以这是团队在这方面的努力:)谢谢!是的,我没有注意到14号之后我没有离开PM。我执行了我做的作业,问题是我在使用时没有看到任何东西:SELECT*FROM user_scheduler_jobs,其中作业名称='mi_trabajo';结束日期引用的null也可能是导致隐式表达式崩溃的原因formatting@MichaelBroughton-是的,的确,我没有发现有人引用了这句话。虽然我的NLS_TIMESTAMP_TZ_格式设置为OP似乎使用的相同模式,
to_TIMESTAMP_TZ('NULL')
获得ORA-01858。是的,我没有注意到下午14点,所以这是团队在这方面的努力:)谢谢!是的,我没有注意到我在14号之后没有离开PM。我执行了我做的作业,问题是我在使用:SELECT*FROM user\u scheduler\u jobs WHERE job\u nam时没有看到任何东西