dbms_job pakage

Oracle/Admin 2013. 10. 29. 09:44

이 패키지를 설정하게 되면 SNP 백그라운드 프로세스가 이 패키지에 설정되어 있는 작업을 수행하게 된다.

SNP 백그라운드 프로세스는 선택적인 프로세스로 초기화 파라미터 파일에 아래의 항목을 설정 한 후 재 시작을 하면 실행 된다.

 

 - job_queue_processes = 1     <-- SNP 프로세스의 개수를 지정한다.

 - job_queue_interval = 60         <-- SNP 프로세스가 Sleep 상태에서 깨어나는 간격을 초로 지정한다.

 

이 패키지는 아래와 같은 다양한 프로시저들을 가지고 있다.

 

submit 

새로운 작업을 job queue 목록에 등록한다 

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_interger,

 what in varchar2,

 next_date in date default sysdate,

 interval in varchar2 default 'null'

 no_parse in boolean default false

 )

 

 - 주요 파라미터의 의미 

 job

 job 번호로 다른 프로시저에서 호출 될 수 있다. 

what 

 수행할 pl/sql 혹은 procedure or package 이름을 지정한다.

 이곳에 직접 수행하기를 원하는 sql 문장을 써도 된다. 

next_date 

 다음에 수행될 시간을 지정한다. 

interval 

 수행되는 주기를 지정하며 초 단위까지 지정 가능하다. 

no_parse 

 Parse 여부를 지정한다. 기본값은 false로 parse를 수행한다. 

 

 

 (1) 새로운 job 등록 테스트

 위에서 살펴본 프로시저들을 사용해서 새로운 job을 등록하는 테스트를 하겠다. 테스트 내용은 job_test01이라느 테이블을 만든 후 1분에 1번씩 해당 테이블에 데이터를 insert 하는 것이다.

 

 step 1. 테스트용 테이블과 sequencem procedure를 생성한다. 

SQL> conn ORACLE_TEST/oracle;
Connected.
SQL>
SQL>
SQL>
SQL> create sequence seq_job_seq1;

Sequence created.

SQL> create table job_test01
  2  (no number,
  3  name varchar2(5)) ;

Table created.

SQL> create or replace procedure insert_job_test01
  2  is
  3   begin
  4   insert into ORACLE_TEST.job_test01
  5   values(seq_job_seq1.nextval , dbms_random.string('a',3));
  6   end;
  7  /

Procedure created.

SQL> 

 

 

 step2. job을 등록할 프로시저를 생성한다. 

SQL> !vi job1.sql
begin
 dbms_job.submit (:jno,
  'ORACLE_TEST.insert_job_test01;',
  sysdate,
  'sysdate + 1/24/60' ,     <-- 1분에 한번씩 실행됨
  false);
 end;
/

:wq! 

 

 * 참고 : 위 5행의 시간 설정 방법 * 

 - 10분에 한번씩 실행하도록 지정하는 경우

  sysdate + 1/24/6 or sysdate + 1/144

-> 1/24 (1시간-60분)  / 6 : 10분 단위,

    1/144 : 24*6으로 나누어도 같은 의미 입니다. (1일은 1440분이므로)

 

- 1분에 한번으로 지정하는 경우

  sysdate + 1/24/60 or sysdate +1/1440

 

- 5분에 한번으로 지정하는 경우

  sysdate + 5/24/60

 

 - 매일 새벽 2시로 지정하는 경우

  trunc(sysdate) + 1 + 2/24    -> 다음날 새벽 2시를 지정함

 

위 예에서 trunc(sysdate)를 사용한 이유는 trunc를 사용하지 않으면 분 단위까지 나오기 때문입니다.

 

 - 매일 반 11시로 지정하는 경우

  trunc(sysdate) +23/24     -> 오늘 밤 11시를 지정했음

 

 

 

 step3. job을 등록한다.

SQL> variable jno number;
SQL>
SQL> @job1.sql

PL/SQL procedure successfully completed.

SQL> print jno;

       JNO
----------
        21                                        <-- 현재 할당된 job 번호를 확인한다. 이번호는 random으로 지정됨

SQL> commit;                                <-- 이 시간부터 job이 수행된다. 즉 commit이 안되면 수행되지 않는다

Commit complete.

SQL>
SQL>
 

 

 

 step4. 수행되고 있는 job 내용을 확인한다.

SQL> set line 200
SQL> col what for a50
SQL> select what, job, next_date, next_sec, failures, broken
  2  from user_jobs
  3  where what ='ORACLE_TEST.insert_job_test01;';

 WHAT                                                      JOB   NEXT_DATE    NEXT_SEC    FAILURES  B
---------------------------------------- ------ -------------  -----------   ----------  -
ORACLE_TEST.insert_job_test01;                    21   29-OCT-13        18:29:24            0         N

SQL>

 

 

 step5. 실제 테이블에 데이터가 입력되는지 확인한다.

 SQL> select * from job_test01;

        NO NAME
---------- -----
         1 zgy
         2 skA
         3 jCl
         4 Akc
         5 FLw

SQL>

 

 

(2) 등록되어 있는 job 삭제하기

SQL> select what, job, next_date, next_sec, failures, broken
  2  from user_jobs;

WHAT                                                      JOB  NEXT_DATE    NEXT_SEC           FAILURES B
------------------------------------- -------- ------------ -------------- -     --------- ---
ORACLE_TEST.insert_job_test01;                   21   29-OCT-13    18:33:25                  0            N

SQL> exec dbms_job.remove(21);

PL/SQL procedure successfully completed.

SQL>  select what, job, next_date, next_sec, failures, broken
  2  from user_jobs;

no rows selected

SQL> 

 

 

 (3) 등록되어 있는 job 수정하기

SQL> select what, job, next_date,next_sec,interval
  2  from user_jobs;


WHAT                                      JOB    NEXT_DATE            NEXT_SEC                       INTERVAL
------------------------------ ---- ------------------- ---------------             ------------------ORACLE_TEST.insert_job_test01;   22    29-OCT-13             18:37:16                       sysdate + 1/24/60
 

 

 수행시간을 1분마다에서 5분마다 1회 수행으로 변경함.

 

 SQL> exec dbms_job.change(:jno,'ORACLE_TEST.insert_job_test01;',sysdate,'sysdate+5/24/60');

PL/SQL procedure successfully completed.

 

SQL> select what, job, next_date,next_sec,interval
  2  from user_jobs;

WHAT                                       JOB       NEXT_DATE                NEXT_SEC                   INTERVAL
------------------------------- ----      -------------             ----------------     ----------------
ORACLE_TEST.insert_job_test01;    22        29-OCT-13                  18:38:35                  sysdate+5/24/60

SQL>

 

 

http://ann-moon.tistory.com/45

Posted by Any DB
,