본문 바로가기

템플릿

Oracle. SCHEDULER 스케쥴러 활용2

 

 

사이트 공지사항을 지정한 시간에 자동으로 활성/비활성 하도록 스케쥴러를 짜보고 싶었다.

활성과 비활성은 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