2016-01-14 2 views
0

Это мой стол и значение:Получение «недействительного месяца» при выполнении dbms_scheduler.create_job?

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 выразить, и я получаю сообщение об ошибке, которое говорит: «не действительный месяц». Что не так с моим форматом даты начала?

Я также хочу знать, должно ли дата окончания иметь слово «Нуль», если я хочу, чтобы моя работа выполнялась навсегда, и если мне нужно авто увеличение моего вставленного значения, чтобы работа могла работать правильно.

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

1) Ваш NLS-параметр может не правильно делать неявный to_date в формате start_Date, поэтому поместите его в функцию to_Date(). Пункт 2) удалите кавычки вокруг NULL для end_Date. Вам нужно установить значение null, а не строку, содержащую слово null. –

+0

Используйте 'start_date => SYSTIMESTAMP' - это проще. –

ответ

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

... кроме вы не можете иметь час, как '14' при использовании AM индикатор/PM:

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 будет уже существуют, поэтому даже в эксперименте это не кажется очень полезным.

+1

Котируемое значение null для end_date может также быть тем, что взорвало неявное форматирование –

+0

@MichaelBroughton - да, действительно, не заметил, что это было указано. Хотя мой NLS_TIMESTAMP_TZ_FORMAT установлен на тот же шаблон, который, по-видимому, использует OP, 'to_timestamp_tz ('NULL')' получает ORA-01858. –

+0

Да, я не заметил 14 часов вечера, поэтому его усилия по созданию тегов на этом :) –

Смежные вопросы