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'

問題は、属性値にセミコロン「;」が含まれていることだと思います それらを使用しないと、エラーが発生しないためです。

この問題を回避するための提案はありますか?

ありがとうございました

4

1 に答える 1

0

問題は、属性値にセミコロン「;」が含まれていることだと思います それらを使用しないと、エラーが発生しないためです。

この問題を回避するための提案はありますか?

エラー...あなたの質問は意味がありません。問題はわかっていますが、repeat_interval カレンダーの構文にある構文エラーを修正したくありませんか?

この単純な例では、トリガーは不必要に複雑に見えます (ただし、使用する正当な理由があるかもしれませんDBMS_JOB)。次の例では、最初にスケジュールされたジョブを毎分 30 秒に実行するように設定し、その後、repeat_intervalvia 構成テーブルを 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')
于 2013-08-22T15:39:47.180 に答える