Как сделать dbms_scheduler.create_job настраиваемым?
Вместо того, чтобы жестко задавать значения dbms_scheduler.create_job repaeat_interval, я хотел бы сделать его настраиваемым. Поэтому я создал новую таблицу, которая позволяет настроить repeat_interval из задания.
Процедура ниже принимает столбец в качестве входных параметров:
PROCEDURE scheduled_job IS
v_start_date swpurge_job_config.start_date%TYPE;
v_freq swpurge_job_config.freq%TYPE;
v_byday swpurge_job_config.byday%TYPE;
v_byhour swpurge_job_config.byhour%TYPE;
v_byminute swpurge_job_config.byminute%TYPE;
v_bysecond swpurge_job_config.bysecond%TYPE;
v_end_date swpurge_job_config.end_date%TYPE;
BEGIN
SELECT start_date
,freq
,byday
,byhour
,byminute
,bysecond
,end_date
INTO v_start_date
,v_freq
,v_byday
,v_byhour
,v_byminute
,v_bysecond
,v_end_date
FROM swpurge_job_config;
dbms_scheduler.create_job(job_name => 'Purge_MW_Log_Data'
,job_type => 'STORED_PROCEDURE'
,job_action => 'DBA_UTILS_OWNER.PURGE_TABLES'
,start_date => 'SYSTIMESTAMP'
,repeat_interval => 'freq' || '=' ||
v_freq || '; ' ||
'byday' || '=' ||
v_byday || '; ' ||
'byhour' || '=' ||
v_byhour || '; ' ||
'byminute' || '=' ||
v_byminute || '; ' ||
'bysecond' || '=' ||
v_bysecond || ';'
,end_date => NULL
,enabled => TRUE
,auto_drop => FALSE
,comments => 'runs weekly and looks for partitions that needs to be purged');
END scheduled_job;
Не уверен, как еще пойти по этому поводу. Любая помощь приветствуется.
Сообщения об ошибках:
ORA-01858: не числовой символ был найден там, где ожидалось числовое значение ORA-06512: в "DBA_UTILS_OWNER.SWPURGE", строка 450 > "dbms_scheduler.create_job(job_name => 'Purge_MW_Log_Data'"
1 ответ
DECLARE
PROCEDURE scheduled_job IS
v_start_date swpurge_job_config.start_date%TYPE;
v_freq swpurge_job_config.freq%TYPE;
v_byday swpurge_job_config.byday%TYPE;
v_byhour swpurge_job_config.byhour%TYPE;
v_byminute swpurge_job_config.byminute%TYPE;
v_bysecond swpurge_job_config.bysecond%TYPE;
--v_end_date swpurge_job_config.end_date%TYPE;
BEGIN
SELECT start_date
,freq
,byday
,byhour
,byminute
,bysecond
-- ,end_date
INTO v_start_date
,v_freq
,v_byday
,v_byhour
,v_byminute
,v_bysecond
-- ,v_end_date
FROM swpurge_job_config;
dbms_scheduler.create_job(job_name => 'Purge_MW_Log_Data'
,job_type => 'STORED_PROCEDURE'
,job_action => 'OWNER.PROCEDURE'
,start_date => v_start_date
,repeat_interval => 'freq' || '=' ||
v_freq || '; ' ||
'byday' || '=' ||
v_byday || '; ' ||
'byhour' || '=' ||
v_byhour || '; ' ||
'byminute' || '=' ||
v_byminute || '; ' ||
'bysecond' || '=' ||
v_bysecond || ';'
,end_date => NULL
,enabled => TRUE
,auto_drop => FALSE
,comments => 'something');
END scheduled_job;
BEGIN
scheduled_job();
END;
/
Проблема заключалась в одинарных кавычках вокруг start_date. Еще одна важная вещь, на которую следует обратить внимание, это то, что v_end_date не может быть проанализирован как параметр в dbms_scheduler (не уверен почему), однако, для меня этого достаточно.