사이트 공지사항을 지정한 시간에 자동으로 활성/비활성 하도록 스케쥴러를 짜보고 싶었다.
활성과 비활성은 DB열에서 n_delinfo에서 0이면 활성, -1이면 비활성하고
컨트롤러로부터 식별할 IDX와 시간을 받는다.
비활성, 활성 프로시저
CREATE OR REPLACE PROCEDURE NOTICE_DISABLE_PROC
(
NIDX IN VARCHAR2
)
AS
BEGIN
UPDATE NOTICE SET N_DELINFO = '-1'
WHERE
NIDX = IDX;
END;
/
CREATE OR REPLACE PROCEDURE NOTICE_ENABLE_PROC
(
NIDX IN VARCHAR2
)
AS
BEGIN
UPDATE NOTICE SET N_DELINFO ='0'
WHERE
NIDX = IDX;
END;
/
-- 삭제하고싶으면 --
DROP PROCEDURE NOTICE_ENABLE_PROC;
DROP PROCEDURE NOTICE_DISABLE_PROC;
-- 테스트 실행 --
EXEC NOTICE_ENABLE_PROC('idx숫자');
<!-- 활성화 예약 스케쥴러 -->
<insert id="notice_res_enable" parameterType="hashmap" useGeneratedKeys="false">
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
JOB_NAME => CONCAT('N',#{idx})
, START_DATE => TO_DATE(#{time},'yyyymmddhh24mi')
, REPEAT_INTERVAL => NULL
, END_DATE => NULL
, JOB_TYPE => 'PLSQL_BLOCK'
, JOB_ACTION => 'BEGIN NOTICE_ENABLE_PROC(''${idx}''); END;'
, COMMENTS => '공지 활성화 예약'
);
DBMS_SCHEDULER.ENABLE(CONCAT('N',${idx}));
END;
</insert>
<!-- 비활성 예약 스케쥴러 -->
<insert id="notice_res_disable" parameterType="hashmap" useGeneratedKeys="false">
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
JOB_NAME => CONCAT('N',#{idx})
, START_DATE => TO_DATE(#{time},'yyyymmddhh24mi')
, REPEAT_INTERVAL => NULL
, END_DATE => NULL
, JOB_TYPE => 'PLSQL_BLOCK'
, JOB_ACTION => 'BEGIN NOTICE_DISABLE_PROC(''${idx}''); END;'
, COMMENTS => '공지 비활성화 예약'
);
DBMS_SCHEDULER.ENABLE(CONCAT('N',${idx}));
END;
</insert>
1. CREATE 등을 사용할 때 Mybatis에서 insert로 지정해도 상관없지만, 이럴경우 어쨌든 insert는 하지 않았기 때문에 리턴값에서 성공여부를 알 수 없다. IDX를 통한 중복체크를 통해 직접 로직을 구현했다.
쿼리문
SELECT * FROM user_scheduler_jobs where JOB_NAME = CONCAT('N', '${idx}')
2. REPEAT_INTERVAL이 NULL이면 첫실행 후 스케쥴러는 자동으로 삭제된다(의외). 삭제기능까지 구현하려 애 쓸 필요가 없다.
3. 프로시저에 넣을 때 변수는 $로 감싼다. $와 #의 사용기준은 내겐 여전히 모호하다.
4. $로 감싸더라도 JOB_ACTION에서 작은따옴표는 두 번 사용되어야한다.
5. Error getting generated key or setting result to parameter object.에러가 발생
현재 지식으론 무슨소린지 모르겠다.
useGeneratedKeys="false"를 추가해주면 아무튼 해결 (디폴트가 false라면서 대체 왜?)
6. 삭제기능 구현할 때
EXEC DBMS_SCHEDULER.DROP_JOB(CONCAT('N','${idx}'))
가 통하지 않는다
BEGIN
DBMS_SCHEDULER.DROP_JOB(
JOB_NAME => CONCAT('N',#{idx}),
FORCE => false);
END;
로 구현 성공
'템플릿' 카테고리의 다른 글
Oracle. SCHEDULER 스케쥴러 활용 1 (0) | 2022.10.13 |
---|