2013-08-21 2 views
0

Я работаю с определенным repeat_interval. Моя цель состояла в том, чтобы извлечь это значение из таблицы, чтобы впоследствии изменить это значение в таблице и соответствующим образом изменить задание. Для этого я сделал следующее: триггерКак получить календарное выражение из таблицы БД

CREATE OR REPLACE TRIGGER config_table_aur AFTER 
    UPDATE OF value ON config_table FOR EACH row WHEN (new.property = 'job_interval') DECLARE v_job NUMBER; 
    BEGIN 
    dbms_job.submit (v_job, 'begin   
update_interval (' || :new.value || ');  
end;'); 
    END; 

И этот триггер вызывает следующую процедуру:

CREATE OR REPLACE 
PROCEDURE update_interval(
    p_new_interval IN config_table.value%type) 
AS 
BEGIN 
    dbms_scheduler.set_attribute ('jobu', 'repeat_interval', p_new_interval); 
END update_interval; 

Где p_new_interval это значение я извлечение из таблицы. Проблема, что у меня, что если я попробовать установить значение в таблице, как это:

FREQ=DAILY; INTERVAL=1; 

Тогда я получаю сообщение об ошибке сказав:

Fila 1: ORA-06550: line 2, column 46: 
PLS-00103: Encountered the symbol ";" when expecting one of the following: 

    year month day hour minute second 
The symbol ";" was ignored. 
ORA-06512: at "SYS.DBMS_JOB", line 82 
ORA-06512: at "SYS.DBMS_JOB", line 140 
ORA-06512: at "SOMESCHEMA.CONFIG_TABLE_AUR", line 3 
ORA-04088: error during execution of trigger 'SOMESCHEMA.CONFIG_TABLE_AUR' 

Я думаю, проблема в том, что атрибут значение содержит точки с запятой ';' потому что, если я их не использую, я не получаю ошибку.

У вас есть предложения обходить эту проблему?

Спасибо

+1

Попробуйте удалить последнюю точку с запятой после «ИНТЕРВАЛ = 1» – OldProgrammer

ответ

0

Я думаю, проблема в том, что значение атрибута содержит точку с запятой «;» потому что, если я их не использую, я не получаю ошибку.

У вас есть предложения обходить эту проблему?

Err ... Ваш вопрос не имеет смысла. Вы знаете проблему, но не хотите исправлять синтаксическую ошибку, которая у вас есть в repeat_intervalcalendaring syntax?

Для этого простого примера триггер выглядит излишне сложным (но у вас может быть веская причина использовать DBMS_JOB). Вот пример, который первым устанавливает плановую работу, чтобы запустить каждую минуту на тридцатый второй и потом меняет repeat_interval запускать каждые 10 секунд с помощью таблицы конфигурации:

-- 
-- scheduler configuration via tailored config table 
-- 

create table scheduler_config (
    Job_name varchar2(100) not null, 
    repeat_interval varchar2(100) not null 
); 

insert into scheduler_config values('logger1', 'FREQ=SECONDLY; BYSECOND=30'); 
commit; 

create or replace trigger scheduler_config_trg 
after update of repeat_interval 
on scheduler_config 
for each row 
declare 
    pragma autonomous_transaction; 
begin 
    -- Note: throws an exception if no such job 
    dbms_scheduler.set_attribute(name => :new.job_name, 
           attribute => 'repeat_interval', 
           value => :new.repeat_interval); 
end; 
/
show errors 

-- 
-- a simple job we want to schedule 
-- 

create table scheduler_log (
    job_name varchar2(100), 
    time timestamp(3), 
    text varchar2(4000) 
); 

begin 
    dbms_scheduler.create_job(
    job_name => 'logger1', 
    job_type => 'PLSQL_BLOCK', 
    job_action => 'BEGIN insert into scheduler_log values(''logger1'', systimestamp, ''Executed!''); commit; END;', 
    start_date => systimestamp, 
    repeat_interval => 'FREQ=SECONDLY; BYSECOND=30', 
    end_date => null, 
    enabled => true, 
    comments => 'Testing configuration'); 
end; 
/

-- 
-- check how much work has been done and when 
-- 

col job_name for a10 
col time for a25 
col text for a20 

select * from scheduler_log order by time; 

-- 
-- I want more job for my money ! 
-- 

update scheduler_config 
    set repeat_interval = 'FREQ=SECONDLY; INTERVAL=10' 
where job_name = 'logger1'; 
commit; 

-- 
-- remove the job 
-- 

exec dbms_scheduler.drop_job('logger1') 
+0

Спасибо, пример был замечательный! –

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