간단한 설명.
job_queue_process = 1 : SNP 프로세스의 개수를 지정
job_queue_interval = 60 : SNP 프로세스가 Sleep 상태에서 깨어나는 간격을 초로 지정
패키지에 있는 프로시저
submit : 새로운 작업을 job quere 목록에 등록
remove : job queue 에 등록된 job 을 제거
change : job queue 에 등록된 job 을 변경
next_date : job queue 에 등록된 job 의 작동시간을 변경
interval : job queue 에 등록된 job 의 수행 주기를 변경
what : 수행할 procedure or package 변경
run : 등록되어 있는 특정 job 을 수동으로 수행
1) job 관리하기
- 기본 문법
DBMS_JOB.submit (
job out binary_integer, -- 실행시킬 job 번호
what in varchar2, -- 실제 작업을 수행하는 PL/SQL 또는 SQL 또는 Procedure 등
next_date in date default sysdate, -- job이 수행될 다음일자
interval in varchar2 default 'null' , -- job이 수행될 다음 시간
no_parse in boolean default false ) --
- 주요 파라미터 의미
job : job 번호로 다른 프로시저에서 호출될 수 있음
what : 수행할 pl/sql or procedure or package 이름을 지정, 직접 수행하기를 원하는 sql문 적어도 됨
next_date : 다음에 수행될 시간을 지정
interval : 수행되는 주기를 지정, 초단위까지 지정가능
no_parse : parse 여부를 지정, 기본값은 false 로 parse를 수행
- 주기 예제
sysdate + 7 : 7일에 한번
sysdate + 1 : 하루에 한번
sysdate + 1/24 : 한 시간에 한번
sysdate + 1/1440 : 1분에 한번(24*60)
sysdate + 1/86400 : 1ch (24*60*60)
*/
-- 실습 : JOB_TEST01 테이블 생성 1분마다 1번씩 데이터 INSERT
-- 1.1
CREATE SEQUENCE JOB_TEST_SEQ;
DROP SEQUENCE JOB_TEST_SEQ;
-- 1.2
CREATE TABLE JOB_TEST01 ( NO NUMBER, NAME VARCHAR2(10) );
DROP TABLE JOB_TEST01;
-- 1.3
CREATE OR REPLACE PROCEDURE INSERT_JOB_TEST01
IS
BEGIN
-- DBMS_RANDOM.VALUE(low IN NUMBER, high IN NUMBER)
-- 파라미터 low : 최소범위 -- high : 최대 범위
INSERT INTO JOB_TEST01 VALUES ( JOB_TEST_SEQ.NEXTVAL, DBMS_RANDOM.STRING('A', 3));
END;
DROP PROCEDURE INSERT_JOB_TEST01;
-- 2. JOB을 등록할 프로시저 생성
DECLARE JNO NUMBER;
BEGIN
DBMS_JOB.SUBMIT(:JNO, 'INSERT_JOB_TEST01;', SYSDATE, 'SYSDATE + 1/24/60', FALSE);
END;
COMMIT;
--3. JOB 등록 내역 조회
SELECT * FROM USER_JOBS;
--4. 결과 확인
SELECT * FROM JOB_TEST01;
--5. 등록되어 있는 JOB 삭제
EXEC DBMS_JOB.REMOVE('64');
SELECT * FROM USER_JOBS WHERE JOBS = 잡번호;
-- 위의 2번 생성 후 주기 변경 해보자.
-- 2번 다시 실행
-- 변경문 실행
EXEC DBMS_JOB.CHANGE(:JNO, 'INSERT_JOB_TEST01;', SYSDATE, 'SYSDATE + 5/24/60');
-- 잡등록 샘플
VARIABLE jobno NUMBER
BEGIN
DBMS_JOB.SUBMIT(:jobno, '프로시저명()', SYSDATE, 'trunc(sysdate) + 1 + 1/24');
END;
-- 수정(오전 3시, 오후 3시)
BEGIN
DBMS_JOB.INTERVAL(42, 'TRUNC(SYSDATE,''MI'')+12/24');
END;
-- 등록된 스케줄을 삭제하는 쿼리
declare
begin
dbms_job.remove( jobno );
commit;
end ;