1. CREATE TABLE
CREATE TABLE GA007_RESULT_RECORD_TBL(
ID NUMBER
, RESULT_CD VARCHAR2(4000)
, BEGIN_TIME DATE
, END_TIME DATE
);
/
2. CREATE PROCEDURE
CREATE OR REPLACE PROCEDURE PROC_GA002_PERFORMANCE
AS
ln_result_code NUMBER;
ln_id NUMBER := 0;
BEGIN
-- テストデータ
ln_result_code := NULL;
SELECT NVL(MAX(id), 0) + 1
INTO ln_id
FROM ga007_result_record_tbl;
INSERT INTO ga007_result_record_tbl(
id
, result_cd
, begin_time
, end_time
) VALUES (
ln_id
, NULL
, CURRENT_DATE
, NULL
);
COMMIT;
-- テスト関数を呼び出す
xxgaif002.main(
iv_company_process_flag => '2'
, on_result_code => ln_result_code
);
UPDATE ga007_result_record_tbl
SET result_cd = ln_result_code
, end_time = CURRENT_DATE
WHERE id = ln_id;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
UPDATE ga007_result_record_tbl
SET result_cd = ln_result_code
, end_time = CURRENT_DATE
WHERE id = ln_id;
COMMIT;
END PROC_GA002_PERFORMANCE;
/
3. CREATE JOB
SET SERVEROUTPUT ON;
/
DECLARE
lv_job_name VARCHAR2(100);
TYPE run_time_ttype IS TABLE OF DATE INDEX BY BINARY_INTEGER;
run_time_tbl run_time_ttype;
ld_start_time DATE;
ln_interval_time NUMBER;
ln_time_diff NUMBER;
lv_job_start_time VARCHAR2(100);
ln_job_count NUMBER := 0;
--==========================================================================
-- ジョブ実行間隔時間(単位:分)
cn_interval_time CONSTANT NUMBER := 10;
-- ジョブ実行回数
cn_run_all_count CONSTANT NUMBER := 14;
-- ジョブ初回実行時間
cd_first_run_time CONSTANT DATE := CURRENT_DATE;
--==========================================================================
BEGIN
lv_job_name := NULL;
-- ローカル時間と標準時間の差
ln_time_diff := CURRENT_DATE - SYSDATE;
-- ジョブ運行開始時間
-- ld_start_time := TO_DATE('2021-08-10 22:00:00', 'YYYY-MM-DD HH24:MI:SS') - ln_time_diff;
-- ld_start_time := CURRENT_DATE;
ld_start_time := cd_first_run_time;
-- ジョブ毎に運行時間間隔(単位:分)
ln_interval_time := cn_interval_time*(60/3600/24);
lv_job_start_time := TO_CHAR(CURRENT_DATE, 'YYYYMMDDHH24MISS');
EXECUTE IMMEDIATE 'TRUNCATE TABLE ga007_result_record_tbl';
run_time_tbl.DELETE;
FOR i IN 1..cn_run_all_count LOOP
run_time_tbl(i) := ld_start_time;
ld_start_time := ld_start_time + ln_interval_time;
END LOOP;
FOR rec IN (
SELECT job_name
INTO ln_job_count
FROM user_scheduler_jobs
WHERE job_name LIKE'GA002_PERFORMANCE%')
LOOP
dbms_scheduler.drop_job(job_name => rec.job_name);
END LOOP;
FOR i IN 1..run_time_tbl.COUNT
LOOP
DBMS_OUTPUT.PUT_LINE(LPAD(i, 2, ' ') || '番目のプログラムの開始時間 :' || TO_CHAR(run_time_tbl(i),'YYYY-MM-DD HH24:MI'));
-- ジョブ名を設定
lv_job_name := 'GA002_PERFORMANCE' || lv_job_start_time || LPAD(i, 2, '0');
-- ジョブを作成
dbms_scheduler.create_job(
job_name => lv_job_name
, job_type => 'STORED_PROCEDURE'
, job_action => 'PROC_GA002_PERFORMANCE'
, start_date => run_time_tbl(i)
, end_date => NULL
, enabled => TRUE
);
END LOOP;
END;
/
4. QUERY JOB
SELECT job_name, job_type, enabled, state FROM user_scheduler_jobs WHERE job_name LIKE'GA002_PERFORMANCE%';
SELECT log_id, log_date, status FROM user_scheduler_job_run_details WHERE job_name LIKE'GA002_PERFORMANCE%' ORDER BY 1 DESC;
SELECT * FROM user_scheduler_job_run_details WHERE job_name LIKE'GA002_PERFORMANCE%' ORDER BY log_id DESC;
SELECT * FROM ga007_result_record_tbl ORDER BY id;
5. DROP OBJECT
DROP TABLE GA007_RESULT_RECORD_TBL;
/
DROP PROCEDURE PROC_GA002_PERFORMANCE;
/