パラメータを1つだけ取り、何らかの仕事をする単純なplsqlプロシージャがあります。プロシージャ自体は、いくつかのデータをログ テーブルに記録し、挿入後にそれをコミットします。つまり、プロシージャの開始、終了などです。
プロシージャ シグネチャは次のとおりです。
pr_procedure_name(batch_size IN NUMBER DEFAULT 1000, poErrorDescription OUT VARCHAR)
そして、これがこの手順を実行するために私が書いたスケジューラ/jb/プログラムです。理想的には、毎日 23 時間に実行したいのですが、テストのために 15 分ごとに実行しています。しかし、うまくいきません。誰かがここで間違っていることを助けることができますか
BEGIN
SYS.DBMS_SCHEDULER.CREATE_SCHEDULE
(
schedule_name => 'CLEAN_EVERYDAY'
,start_date => trunc(SYSDATE)
,repeat_interval => /*'FREQ=DAILY; BYHOUR=23;'*/ 'freq=MINUTELY;interval=15;'
,end_date => NULL
,comments => 'Description goes here'
);
END;
/
BEGIN
SYS.DBMS_SCHEDULER.CREATE_PROGRAM
(
program_name => 'BATCH_CLEANUP'
,program_type => 'PLSQL_BLOCK'
,program_action => 'DECLARE
nErrorCode NUMBER;
sErrorDesc VARCHAR2 (32767);
BEGIN
pr_procedure_name( poErrorDescription=>sErrorDesc ) ;
IF (poErrorDescription IS NOT NULL)
THEN
RAISE_APPLICATION_ERROR (-20000, sErrorDesc);
END IF;
END;'
,number_of_arguments => 0
,enabled => TRUE
,comments => 'More comments'
);
END;
/
BEGIN
SYS.DBMS_SCHEDULER.CREATE_JOB
(
job_name => 'CLEAN_JB'
,schedule_name => 'CLEAN_EVERYDAY'
,program_name => 'BATCH_CLEANUP'
,comments => NULL
);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'CLEAN_JB'
,attribute => 'RESTARTABLE'
,value => TRUE);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'CLEAN_JB'
,attribute => 'LOGGING_LEVEL'
,value => SYS.DBMS_SCHEDULER.LOGGING_RUNS);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name => 'CLEAN_JB'
,attribute => 'MAX_FAILURES');
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name => 'CLEAN_JB'
,attribute => 'MAX_RUNS');
BEGIN
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'CLEAN_JB'
,attribute => 'STOP_ON_WINDOW_CLOSE'
,value => FALSE);
EXCEPTION
-- could fail if program is of type EXECUTABLE...
WHEN OTHERS THEN
NULL;
END;
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'CLEAN_JB'
,attribute => 'JOB_PRIORITY'
,value => 3);
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE_NULL
( name => 'CLEAN_JB'
,attribute => 'SCHEDULE_LIMIT');
SYS.DBMS_SCHEDULER.SET_ATTRIBUTE
( name => 'CLEAN_JB'
,attribute => 'AUTO_DROP'
,value => FALSE);
SYS.DBMS_SCHEDULER.ENABLE
(name => 'CLEAN_JB');
END;
/