λͺ©μ°¨
β β β μ€λΌν΄ μ‘ μ€μΌμ€λ¬(JOB SCHEDULER) β β β
β β β μ€λΌν΄ μ‘ μ€μΌμ€λ¬(JOB SCHEDULER) β β β .txt
β β β β μ€λΌν΄ μ‘ μ€μΌμ€λ¬(JOB SCHEDULER) β β β
β κ°μ
- λ°μ΄ν°λ² μ΄μ€μμ 쿼리λ νλ‘μμ λ±μ νμ©νμ¬
μΌμ μ£ΌκΈ°λ³λ‘ (μ°, μ, μΌ, μκ° λ±)
μνλ μμ
μ μλμΌλ‘ μνν μ μλλ‘ μ²λ¦¬νλ κ°μ²΄.
→β μ€λΌν΄ μ‘ μ€μΌμ€λ¬(JOB SCHEDULER), μ‘(JOB)
β» μ€λΌν΄ 10g λΆν° μ§μ
- μ€λΌν΄μμ νλ‘μμ λΌλ μ§ νΉμ ν
μ΄λΈμ λ°μ΄ν°λ₯Ό μ μ¬νλ λ±
μΌμ μκ°, λ§€μΌ λλ λ§€λ¬ μ€ννμ¬ μμ
νλ κ²½μ°κ° μ’
μ’
μλ€.
μ΄μ κ°μ κ²½μ° μλμΌλ‘ νΉμ μκ°λ§λ€ λ±λ‘νλ κ²μ΄ μλλΌ
μ€λΌν΄μμ μΌμ μκ°λ§λ€ λ°λ³΅μ μΌλ‘ μ€ννλλ‘ ν μ μλ€.
- μ€μΌμ€λ¬(SCHEDULER), μ‘(JOB)μ λ°λ³΅νλ μ€νλ¬Έμ λ±λ‘νλ κ²μ
μ€λΌν΄ λ²μ μ λ°λΌ ν¬κ² 2κ°μ§ λ°©λ²μ μ¬μ©ν μ μλ€.
β γORACLE JOBγ vs γORACLE SCHEDULERγ
- γORACLE JOBγμ PLSQL_BLOCK, STORED_PROCEDURE λ§ κ΅¬λ
- μ€λΌν΄ 10g λΆν° γORACLE SCHEDULERγλ₯Ό μ§μ
- γORACLE SCHEDULERγ μμλ μ΄μ체μ μ λ±λ‘λλ SHELL νλ‘κ·Έλ¨ λ±λ ꡬλ κ°λ₯
β DBMS_JOB
- νΉμ μκ° λ° κ°κ²©μΌλ‘ νΉμ μμ
μ μν
β DBMS_SCHEDULER
- 볡μ‘νκ³ μ κ΅ν μμ€μ μ€μΌμ€ μμ
κ°λ₯
β DBMS_SCHEDULER μ μ₯μ
- GUI(EM)μ ν΅ν κ΄λ¦¬κ° μ½λ€.
- λͺ¨λνλ μ€μΌμ€ μ€λΈμ νΈλ₯Ό ν΅ν΄ μ½κ² 곡μ ν μ μλ€.(νλ‘κ·Έλ¨, μ€μΌμ€, μ‘)
- TimeZone μ΄ μ§μλλ€.
- (DataPumpλ₯Ό νμ©νμ¬) λ€λ₯Έ λ°μ΄ν°λ² μ΄μ€ μ΄λμ΄ μ½λ€.
β μ€λΌν΄ μ€μΌμ€λ¬ λ±λ‘μ μν κΆν(κΈ°λ³Έ : SYS → SCOTT)
- GRANT CREATE ANY JOB TO κ³μ λͺ
;
GRANT CREATE ANY JOB TO SCOTT;
-->> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
β μ€λΌν΄ μ€μΌμ€λ¬ λ±λ‘μ μν κΆν(μΆκ° : SYS → SCOTT)
- GRANT EXECUTE ON DBMS_SCHEDULER TO κ³μ λͺ
;
GRANT EXECUTE ON DBMS_SCHEDULER TO SCOTT;
--==>> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
- GRANT EXECUTE ON DBMS_ISCHED TO κ³μ λͺ
;
GRANT EXECUTE ON DBMS_ISCHED TO SCOTT;
--==>> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
- GRANT CREATE JOB, MANAGE SCHEDULER TO κ³μ λͺ
;
GRANT CREATE JOB, MANAGE SCHEDULER TO SCOTT;
--==>> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
β μ¬μ© μ μ°¨(μ²λ¦¬ μμ)
1. μλν νλ‘κ·Έλ¨ λ±λ‘
: μ€μΌμ€λ¬κ° λλ©΄μ μ€μ λ‘ κ΅¬λλ νλ‘κ·Έλ¨μ λ±λ‘νλ€.
2. μ€μΌμ€ λ±λ‘
: μ£ΌκΈ°μ μΌλ‘ λμκ° μ€μΌμ€μ λ±λ‘νλ€.
3. μ‘ λ±λ‘
: μ€μ μνν μ
무λ‘, μ€μΌμ€κ³Ό νλ‘κ·Έλ¨μ λͺ
μν΄μ€λ€.
β» νλ‘κ·Έλ¨(PROGRAM)
- μ€ν κ°λ₯ν νλ‘κ·Έλ¨(Program)μ λ§νλ€.
- DBMS_JOB μ PL/SQL λΈλ‘, μ μ₯ νλ‘μμ (Stored Procedure)λ§ κ°λ₯
- DBMS_SCHDULER λ μΈλΆ νλ‘κ·Έλ¨κΉμ§ μ¬μ© κ°λ₯
(PL/SQL λΈλ‘, μ μ₯ νλ‘μμ (Stored Procedure), μ€ν νμΌ(Executetable, Unix Shell, Windows μ€ν νμΌ λ±)
- DBMS_SCHDULER.CREATE_PROGRAM νλ‘μμ λ₯Ό ν΅ν΄ λ±λ‘ κ°λ₯νλ©°
[ALL/DBA/USER]_SCHEDULER_PROGRAMS λ·°λ₯Ό ν΅ν΄ νμΈ κ°λ₯
- μ€μΌμ€λ§μ μν΄ μ€νλλ λμ(νλ‘κ·Έλ¨ μ΄λ¦, νμ
, Argument κ°―μ λ±)
β» μ€μΌμ€(SCHEDULE)
- μμ
μ μνν μ€μΌμ€μ λ§νλ€.
- μμ
μμ μκ°, μ’
λ£ μκ°, κ°κ²© λ±μ μ§μ ν μ μλ€.
- DBMS_JOB μ λΉν΄ μ μ°νλ€.
ex) "FREQ=YEARLY; BYMONTH=4; BYMONTHDAY=15; BYHOUR=9; BYMINUTE=0; BTSECOND=0"
→ 맀λ
4μ 15μΌ 9μ μ κ°μ μμ
μν
- DBMS_SCHDULER.CREATE_SCHECULERS νλ‘μμ λ₯Ό ν΅ν΄ λ±λ‘ν μ μμΌλ©°
[ALL/DBA/USER]_SCHEDULER_SCHDULES λ·°λ₯Ό ν΅ν΄ νμΈ κ°λ₯
β» μ‘(JOB)
- μ€λΌν΄μμ μ€μΌμ€λ¬λ₯Ό ν΅ν΄ νΉμ μμ
μ μνν λ,
κ·Έ λ¨μλ₯Ό μ‘(JOB) μ΄λΌκ³ νλ€.
- μ£Όμ΄μ§ νλ‘κ·Έλ¨κ³Ό μ€μΌμ€μ λ°λΌ μνν μμ
μ λ§νλ€.(μΈμ , 무μμ)
- λͺ
μμ μΌλ‘ μμ±λ νλ‘κ·Έλ¨κ³Ό μ€μΌμ€μ μ΄μ©ν μλ μκ³ ,
μμ
μ μμ±νλ©΄ μ묡μ μΈ νλ‘κ·Έλ¨κ³Ό μ€μΌμ€μ μμ±ν μλ μλ€.
- DBMS_SCHEDULER.CREATE_JOB νλ‘μμ λ₯Ό ν΅ν΄ λ±λ‘ν μ μμΌλ©°
[ALL/DBA/USER]_SCHEDULER_JOBS λ·°λ₯Ό ν΅ν΄ νμΈ κ°λ₯
- μμ
μ΄ μνλλ©΄μ λ¨κ²λλ λ‘κ·Έ λ°μ΄ν°λ
[ALL/DBA/USER]_SCHEDULER_JOB_LOG λ·°λ
[ALL/DBA/USER]_SCHEDULER_JOB_RUN_DETAILS λ·°λ₯Ό ν΅ν΄ νμΈ κ°λ₯
β» μ‘ ν΄λμ€(JOB CLASS)
- μμ
μ κ³΅ν΅ μμ±μ λ¬Άμ΄μ λ§λ λΆλ₯λ₯Ό λ§νλ€.
- Resource Consumer Group, Service, Logging Level, Log History μ μμ±μ μ‘°ν©νμ¬
νλμ ν΄λμ€λ₯Ό μμ±νλ€.
- Resource Consumer Group μ DBMS_RESOURCE_MANAGER ν¨ν€μ§λ₯Ό ν΅ν΄ μμ±νλ©°,
μμμ μΌλ§λ μ¬μ© κ°λ₯νκ² ν κ²μΈμ§λ₯Ό μ§μ νλ€.
- Service λ μμ
μ΄ νΉμ μλΉμ€μ λν 리μμ€ μΉνλ(Resource Affinity)λ₯Ό κ°μ§λλ‘ μ§μ νλ€.
μ¦, Service λ RACμμ ν΄λμ€ν° λ΄μ μ¬λ¬ λ
Έλλ₯Ό λ¬Άμ λ
Όλ¦¬μ μΈ κ·Έλ£Ήμ΄λ€.
- Logging Level μ μμ
μ€νμ λν λ‘κ·Έ λ°μ΄ν°μ λ 벨μ μ§μ νλ€.
- Log History λ λ‘κ·Έ λ°μ΄ν°λ₯Ό μΌλ§λ μ μ₯ν μ§λ₯Ό μ§μ νλ€.
- κ°μ μμ
ν΄λμ€μ μνλ μμ
μ κ°μ μμ±μ 곡μ νκΈ° λλ¬Έμ
κ΄λ¦¬ μμ νΈμμ±μ μ 곡νλ€.
- νλμ JOB μ νλμ JOB CLASS μλ§ μμλλ€.
β» μλμ°(WINDOW)
- νΉμ 리μμ€ νλ(Resource Plan)μ μ μ©νλ μκ° λ¨μλ₯Ό μλ―Ένλ€.
- 리μμ€ νλμ μ€λΌν΄μ΄ μμμ κ΄λ¦¬νλ λ¨μλ‘
μμ
μ μ’
λ£μ λ°λΌ CPU λ±μ μμμ μΌλ§λ λΆμ¬ν μ§λ₯Ό μ§μ νλ μν μ νλ€.
(μλμ°λ₯Ό μ§μ νκ² λλ©΄ ν΄λΉ μλμ° μμμ μ€νλλ μμ
μ
μλμ° μμ± μ μ§μ ν 리μμ€ νλμ μ¬μ©νκ² λλ€.)
⻠체μΈ(CHAIN)
- νλ‘κ·Έλ¨μ μ§ν©μ μλ―Ένλ€.
- μΌλ ¨μ νλ‘κ·Έλ¨λ€μ μμλλ‘ μνν΄μΌ ν λ μ¬μ©νλ€.
- 체μΈμ ORACLE 10g R2 μμ μΆκ°λ κΈ°λ₯μ΄λ€.
- μ€μΌμ€ μμ
κ³Ό RAC Instnace
- DBMS_JOB => μμ
μ μνν μΈμ€ν΄μ€ λ²νΈλ₯Ό μ§μ (νλμ λ
Έλλ‘ μ§μ νλ©΄ νΈμμ± ν₯μ)
- DBMS_SCHEDULER => Instance_Stickness λΌλ κ°λ
μ ν΅ν΄ μ§λ₯μ μΌλ‘ μΈμ€ν΄μ€λ₯Ό ν λΉ
- INSTANCE_STICKNESS => TRUE(DBMS_SCHEDULER.SET_ATTRIBUTE) μλ―Έ
- μμ
μν μ νμ¬ κ°μ₯ λΆνκ° μ μ μΈμ€ν΄μ€ μμ
μ λΆλ°°νλ€.
μ΄ν μμ
μν μμλ κ°λ₯ν μ΅μ΄μ μ§μ λ μΈμ€ν΄μ€μμ μμ
.
- μ΄μ κ°μ μ±κ²©μ μΈμ€ν΄μ€ μ μ°©λλΌκ³ νλ©° 리μμ€ μΉνλλ₯Ό ꡬννλ λ°©λ²
- μ΅μ΄ μ§μ λ μΈμ€ν΄μ€κ° λ€μ΄λκ±°λ, λΆνκ° μ¬ν΄ μμ
μ μνν μ μμ λ
λ€λ₯Έ μΈμ€ν΄μ€μμ μμ
μ μννκ² λλ€.
- INSTANCE_STICKNESS μμ± κ°μ΄ FALSE μ΄λ©΄, μ€λΌν΄μ μΈμ€ν΄μ€ μμλλ‘ μμ
μ μννλ€.
μ¦, DBMS_JOB ν¨ν€μ§λ₯Ό μ΄μ©ν΄ μμ
μ μννλ
μΈμ€ν΄μ€ λ²νΈλ₯Ό μ§μ νμ§ μμ κ²½μ°μ κ±°μ κ°μ λ°©μμΌλ‘ μλνλ€.
β μ κ±°
1. μ‘ μ κ±°
2. νλ‘κ·Έλ¨ μ κ±°
3. μ€μΌμ€ μ κ±°
β» JOB λ₯Ό λ¨Όμ μ§μ°κ³ PROGRAM μ μ§μ΄λ€.
PROGRAM μ λ¨Όμ μ κ±°νκ² λλ©΄ μ’
μλ κ°μ²΄μ΄κΈ° λλ¬Έμ μλ¬ λ°μνλ€.
μ€μΌμ€λ κ°μ λ°©λ²μΌλ‘ μ²λ¦¬νλ€.
β μ€λΌν΄ μ€μΌμ€λ¬ λͺ
λ Ή νλ‘μμ
- DBMS_SCHEULER.CREATE_PROCEDURE
: μ‘μ΄ μ€μΌμ€λ¬μ μ€μ λλ‘ κ΅¬λνλ©°
μ€μ λμνλ νλ‘κ·Έλ¨(μΈλΆ SHELL, SP, PLSQL_BLOCK λ±)μ λ±λ‘νλ€.
- DBMS_SCHEDULER.CREATE_SCHEDULER
: μ£ΌκΈ°μ μΌλ‘ λμκ° μ€μΌμ€μ λ±λ‘νλ€.
- DBMS_SCHEDULER.CREATE_JOB
: μνν μμ
μ λ±λ‘νλ€.
- DBMS_SCHEDULER.DROP_JOB
: μ€μΌμ€μ μμ νλ€.
- DBMS_SCHEDULER.ENABLE
: μ€μΌμ€μ μμνλ€.
- DBMS_SCHEDULER.DISABLE
: μ€μΌμ€μ μ μ§νλ€.
β μ€λΌν΄ μ‘ λͺ
λ Ή νλ‘μμ
- DBMS_JOB.SUBMIT
: μ‘μ λ±λ‘νλ€.
- DBMS_JOB.REMOVE
: μ‘μ μ κ±°νλ€.
- DBMS_JOB.CHANGE
: μ‘μ FIELD λ₯Ό λ³κ²½νλ€.
- DBMS_JOB.NEXT_DATE
: μ‘μ λ€μ μνμκ°(μλμΌλ‘ μ€νλ λ)μ λ³κ²½νλ€.
- DBMS_JOB.INTERVAL
: μ‘μ μ€ν λ°λ³΅ μ£ΌκΈ°(CYCLE) νλΌλ―Έν°λ₯Ό λ³κ²½νλ€.
- DBMS_JOB.WHAT
: μ‘μ μν μ
λ¬΄λ‘ λ±λ‘λ κ°μ²΄(OBJECT)λ₯Ό λ³κ²½νλ€.
- DBMS_JOB.RUN
: μ‘μ μλμΌλ‘ μ€ν(νμ¬ SESSION μμ μ¦μ μ€ν)νλ€.
- DBMS_JOB.JOB_BROKEN
: μ‘μ μνλ₯Ό μ μ λλ BROKEN μνλ‘ μ€μ νλ€.
β λ±λ‘ μ 보 νμΈ(μ€μΌμ€λ¬ κ΄λ ¨ DBMS μ‘°ν ꡬ문)
SELECT *
FROM USER_SCHEDULER_JOBS; -- λ±λ‘λ JOB
SELECT *
FROM USER_SCHDULER_JOB_ARGS; -- JOB μ 맀κ°λ³μ(ARGUMENTS)
SELECT *
FROM USER_SCHEDULER_RUNNING_JOBS; -- ꡬλμ€μΈ(RUNNING) JOB λ€μ μ 보
SELECT *
FROM USER_SCHEDULER_JOB_LOG; -- JOB μ LOG
SELECT *
FROM USER_SCHEDULER_JOB_RUN_DETAILS; -- JOB μ μνλ μ 보 λ° μλ¬ μ 보
SELECT *
FROM USER_SCHEDULER_PROGRAMS; -- λ±λ‘λ PROGRAM
SELECT *
FROM USER_SCHEDULER_PROGRAMS_ARGS; -- PROGRAM μ 맀κ°λ³μ(ARGUMENTS)
SELECT *
FROM USER_SCHEDULER_SCHEDULES; -- λ±λ‘λ μ€μΌμ€λ¬(SCHEDULER)
β INTERVAL μ€μ λ°©λ²(WHEN / HOW MANY μ λν μ μ)
Type A. - PL/SQL νν λ°©λ²(USING PL/SQL EXPRESSION)
REPEAT_INTERVAL => 'SYSDATE+36/24'
Type B. λ¬λ ₯ νν λ°©λ²(USING CALENDAR EXPRESSION)
REPEAT_INTERVAL => 'FREQ=HOURLY; INTERVAL=4'
REPEAT_INTERVAL => 'FREQ=YEARLY; BYMONTH=MAR,JUN,SEP,DEC; BYMONTHDATE=15'
ex)
'SYSDATE + 1'
-- 맀μΌ(Execute daily)
-- → νμ¬ μκ°μΌλ‘λΆν° λ€μλ νμ¬ μκ°μ μ€ν
-- μ¦, νμ¬ μκ°μ΄ μ€ν 3μλ©΄ λ§€μΌ μ€ν 3μμ μ€ν
'SYSDATE + 7'
-- μΌμ£ΌμΌμ ν λ²(Execute once per week)
'SYSDATE + 1/24'
-- ν μκ°μ ν λ²(Execute hourly)
'SYSDATE + 10/1440'
'SYSDATE + 1/2416'
-- 10λΆμ ν λ²(Execute every 10 min)
'SYSDATE + 30/86400'
-- 30μ΄μ ν λ²(Execute every 30 sec)
'SYSDATE + 1/1440'
-- 1λΆμ ν λ²
NULL
-- λ€μ μ€ννμ§ μμ(Do not re-execute)
'TRUNC(SYSDATE) + 1 + 5 / 24'
-- λ§€μΌ μλ²½ 5μμ μ€ν
'TRUNC(SYSDATE) + 22 / 24'
-- λ§€μΌ λ°€ 10μμ μ€ν
JOB_SCHEDULER_sys.sql
SELECT USER
FROM DUAL;
--==>> SYS
-- κΆν λΆμ¬(SYS → SCOTT)
GRANT CREATE ANY JOB TO SCOTT;
-->> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
GRANT EXECUTE ON DBMS_SCHEDULER TO SCOTT;
--==>> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
GRANT EXECUTE ON DBMS_ISCHED TO SCOTT;
--==>> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
GRANT CREATE JOB, MANAGE SCHEDULER TO SCOTT;
--==>> Grantμ(λ₯Ό) μ±κ³΅νμ΅λλ€.
JOB_SCHEDULER_A_sys.sql
SELECT USER
FROM DUAL;
--==>> SCOTT
-- μ€μΌμ€λ¬ μ μ μλμ¬λΆ νμΈμ μν
-- ν
μ΄λΈ λ° νλ‘μμ μμ±
--β μ€μ΅ ν
μ΄λΈ μμ±(TBL_TEST)
CREATE TABLE TBL_TEST
( NOW_COL VARCHAR2(30)
);
--==>> Table TBL_TESTμ΄(κ°) μμ±λμμ΅λλ€.
--β μ€μ΅ νλ‘μμ μμ±(PRC_TEST)
CREATE OR REPLACE PROCEDURE PRC_TEST
(P_NOW_COL IN VARCHAR2
)
IS
BEGIN
INSERT INTO TBL_TEST(NOW_COL) VALUES(P_NOW_COL);
COMMIT;
END;
--==>> Procedure PRC_TESTμ΄(κ°) μ»΄νμΌλμμ΅λλ€.
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>> Sessionμ΄(κ°) λ³κ²½λμμ΅λλ€.
--β ν
μ€νΈ(νμΈ)
SELECT TRUNC(SYSDATE) + 12/24
FROM DUAL;
--==>> 2024-02-19 12:00:00
--β μ€μΌμ€λ¬ μ‘ λ±λ‘
BEGIN
DBMS_SCHEDULER.CREATE_JOB
( JOB_NAME => 'JOB_PRC_TEST'
-- μ‘ μ΄λ¦μ λλ‘λ μ‘ μ΄λ¦λ€ μ€ μ λν¬νκΈ°λ§ νλ©΄ λκ³ ,
-- μ€μΌμ€λ¬μμ μ‘μ μμ ν λ μ‘ μ΄λ¦μ νλΌλ―Έν°λ‘ μ
λ ₯νμ¬ μμ νκ² λλ€.
, START_DATE => TRUNC(SYSDATE) + 12/24
, REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=1'
-- START_DATE μ REPEAT_INTERVAL μ μ€μΌμ€λ¬μ λ±λ‘ν μ‘μ΄
-- μΌμ μκ°λ§λ€ λ°λ³΅λλλ‘ νλ μ΅μ
μΌλ‘ μλ‘ μ°κ΄ κ΄κ³κ° μλ€.
-- START DATE λ μ‘μ΄ μ΅μ΄λ‘ μ€νλλ μκ°μ μ§μ νκ² λλ©°
-- REPEATE_INTERVAL μ λ°λ³΅λλ νμμ μ§μ νκ² λλ€.
-- λ§μ½, μμμ START_DATE μ TRUNC(SYSDATE+1) + 12/24 μ κ°μ΄ μ§μ νλ€λ©΄
-- TRUNC(SYSDATE+1) μ λ΄μΌμ μλ―Ένλ€.
-- μ¦, γSELECT TRUNC(SYSDATE+1) FROM DUALγκ³Ό κ°μ΄ 쿼리문μ μ€ννλ©΄
-- λ΄μΌ μΌμκ° μ‘°νλλ κ²μ νμΈν μ μλ€.
-- γ12/24γλ μ μ€λ₯Ό μλ―Ένλ κ°μ΄ λλ€.
, END_DATE => SYSDATE + 5
-- END_DATE λ μ‘μ λ§λ£ μκ°μ μλ―Ένλ€.
-- μꡬμ μΈ λ°λ³΅ μ€νμ μ€μ νλ €λ©΄ NULL μ μ§μ νκ² λλ€.
-- μκ°κ³Ό κ΄κ³μμ΄ μΌμ£ΌμΌλ§ μ€νλκΈ°λ₯Ό λ°λλ€λ©΄
-- γTRUNC(SYSDATE+7)γκ³Ό κ°μ΄ λ±λ‘νκ² λλ€.
--, JOB_CLASS => 'DEFAULT_JOB_CLASS'
, JOB_TYPE => 'PLSQL_BLOCK'
, JOB_ACTION => 'BEGIN PRC_TEST(TO_CHAR(SYSDATE, ''YYYY-MM-DD HH24:MI:SS''));END;'
, COMMENTS => 'JOB λ±λ‘ μ€μ΅'
);
DBMS_SCHEDULER.ENABLE('JOB_PRC_TEST');
END;
--==>> PL/SQL νλ‘μμ κ° μ±κ³΅μ μΌλ‘ μλ£λμμ΅λλ€.
--β μ€μΌμ€λ¬ μ‘ λ±λ‘ λ΄μ νμΈ
SELECT *
FROM USER_SCHEDULER_JOBS
WHERE JOB_NAME = 'JOB_PRC_TEST' ;
--==>>
/*
JOB_PRC_TEST REGULAR SCOTT PLSQL_BLOCK BEGIN PRC_TEST(TO_CHAR(SYSDATE, 'YYYY-MM-DD HH24:MI:SS'));END; 0 CALENDAR 24/02/19 12:00:00.000000000 +09:00 FREQ=DAILY; INTERVAL=1 24/02/24 11:11:16.000000000 +09:00 DEFAULT_JOB_CLASS TRUE TRUE FALSE SCHEDULED 3 0 0 0 24/02/19 12:00:00.000000000 +09:00 OFF FALSE TRUE FALSE 1 NLS_LANGUAGE='KOREAN' NLS_TERRITORY='KOREA' NLS_CURRENCY='οΏ¦' NLS_ISO_CURRENCY='KOREA' NLS_NUMERIC_CHARACTERS='.,' NLS_CALENDAR='GREGORIAN' NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS' NLS_DATE_LANGUAGE='KOREAN' NLS_SORT='BINARY' NLS_TIME_FORMAT='HH24:MI:SSXFF' NLS_TIMESTAMP_FORMAT='RR/MM/DD HH24:MI:SSXFF' NLS_TIME_TZ_FORMAT='HH24:MI:SSXFF TZR' NLS_TIMESTAMP_TZ_FORMAT='RR/MM/DD HH24:MI:SSXFF TZR' NLS_DUAL_CURRENCY='οΏ¦' NLS_COMP='BINARY' NLS_LENGTH_SEMANTICS='BYTE' NLS_NCHAR_CONV_EXCP='FALSE' 1 FALSE FALSE JOB λ±λ‘ μ€μ΅ 133168
*/
--β μ§μ ν μκ°μ μ€μΌμ€λ¬ μ‘μ΄ μ μμ μΌλ‘ μ€νλμλμ§ νμΈ
SELECT *
FROM USER_SCHEDULER_JOB_LOG
WHERE JOB_NAME = 'JOB_PRC_TEST';
--( 11:24 κΈ°μ€ )
--==>> μ‘°ν κ²°κ³Ό μμ
--( 12:22 κΈ°μ€ )
--==>>
/*
8992 24/02/19 12:21:48.099000000 +09:00 SCOTT JOB_PRC_TEST DEFAULT_JOB_CLASS RUN SUCCEEDED
*/
SELECT *
FROM USER_SCHEDULER_JOB_RUN_DETAILS
WHERE JOB_NAME = 'JOB_PRC_TEST';
--( 11:25 κΈ°μ€ )
--==>> μ‘°ν κ²°κ³Ό μμ
--( 12:22 κΈ°μ€ )
--==>>
/*
8992 24/02/19 12:21:48.114000000 +09:00 SCOTT JOB_PRC_TEST SUCCEEDED 0 24/02/19 12:00:00.000000000 +09:00 24/02/19 12:21:48.099000000 +09:00 +00 00:00:00.000000 1 74,645 10832 +00 00:00:00.000000
*/
--β» ALL...DETAILS, DBA...DETAILS, USER...DETAILS μ κ°μ΄
-- γDETAILSγκ° λΆμ μ€μΌμ€λ¬ μ‘ λ‘κ·Έ λμ
λ리 λ·°λ
-- μ€ν μ€ν¨ κ΄λ ¨ μλ¬ λ΄μ©μ μ‘°νν μ μλ€.
SELECT *
FROM TBL_TEST;
--( 11:28 κΈ°μ€ )
--==>> μ‘°ν κ²°κ³Ό μμ
--( 12:23)
--==>>
/*
2024-02-19 12:21:48
*/
--β» μ‘ μμ ꡬ문
EXEC DBMS_SCHEDULER.DROP_JOB('JOB_PRC_TEST');
--β» νλ‘μμ μμ ꡬ문
DROP PROCEDURE PRC_TEST;
--β» ν
μ΄λΈ μμ ꡬ문
DROP TABLE TBL_TEST;
JOB_SCHEDULER_B_scott.sql
SELECT USER
FROM DUAL;
--==>> SCOTT
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>> Sessionμ΄(κ°) λ³κ²½λμμ΅λλ€.
SET SERVEROUTPUT ON;
--==>> μμ
μ΄ μλ£λμμ΅λλ€.(0.031μ΄)
--β μ€μ΅ ν
μ΄λΈ μμ±(TBL_JOBTEST)
CREATE TABLE TBL_JOBTEST
( SID NUMBER
, NAME VARCHAR2(30)
, TEL VARCHAR2(40)
, REG_DATE DATE DEFAULT SYSDATE
, CONSTRAINT JOBTEST_SID_PK PRIMARY KEY(SID)
);
--==>> Table TBL_JOBTESTμ΄(κ°) μμ±λμμ΅λλ€.
--β μνμ€ μμ±(JOBTESTSEQ)
CREATE SEQUENCE JOBTESTSEQ
NOCACHE;
--==>> Sequence JOBTESTSEQμ΄(κ°) μμ±λμμ΅λλ€.
--β νλ‘μμ μμ±(PRC_JOBTEST)
CREATE OR REPLACE PROCEDURE PRC_JOBTEST
IS
V_NUM NUMBER := 0;
BEGIN
V_NUM := V_NUM + 1;
INSERT INTO TBL_JOBTEST
VALUES(JOBTESTSEQ.NEXTVAL, 'νμΈ'||V_NUM, '010-1212-3434', DEFAULT);
COMMIT;
EXCEPTION
WHEN OTHERS THEN ROLLBACK;
END;
--==>> Procedure PRC_JOBTESTμ΄(κ°) μ»΄νμΌλμμ΅λλ€.
--β νλ‘κ·Έλ¨ λ±λ‘
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM
( PROGRAM_NAME => 'TEST_PRG'
, PROGRAM_ACTION
)
END;
JOB_SCHEDULER_C_scott.sql
SELECT USER
FROM DUAL;
--==>> SCOTT
-- FINAL PROJECT μΌλΆ ν
μ΄λΈ μνλ§
-- (κ·Έλ£Ήμ΄λ, μ§μ 72μκ° μ§λλ©΄ 무μλ΅ / κ·Έλ£Ήμ΄λ)
ALTER SESSION SET NLS_DATE_FORMAT = 'YYYY-MM-DD HH24:MI:SS';
--==>> Sessionμ΄(κ°) λ³κ²½λμμ΅λλ€.
SET SERVEROUTPUT ON;
-- νμ ν
μ΄λΈ μμ±
CREATE TABLE USERS
(US_CODE NUMBER PRIMARY KEY
,US_ID VARCHAR2(30) NOT NULL UNIQUE
,US_PWD VARCHAR2(40) NOT NULL
,US_SIGNUP DATE DEFAULT SYSDATE NOT NULL
,US_PROFILE VARCHAR2(300)
);
--==>> Table USERSμ΄(κ°) μμ±λμμ΅λλ€.
DROP TABLE USERS;
INSERT INTO USERS(US_CODE, US_ID, US_PWD)
VALUES(1, 'USER1', '1234567');
INSERT INTO USERS(US_CODE, US_ID, US_PWD)
VALUES(2, 'USER2', '2345678');
INSERT INTO USERS(US_CODE, US_ID, US_PWD)
VALUES(3, 'USER3', '3345678');
INSERT INTO USERS(US_CODE, US_ID, US_PWD)
VALUES(4, 'USER4', '4445678');
INSERT INTO USERS(US_CODE, US_ID, US_PWD)
VALUES(5, 'USER5', '5545678');
SELECT *
FROM USERS;
COMMIT;
--==>> μ»€λ° μλ£.
--μΉκ΅¬ ν
μ΄λΈ μμ±
CREATE TABLE FRIENDS
(FR_CODE NUMBER PRIMARY KEY
,US_CODE1 NUMBER NOT NULL
,US_CODE2 NUMBER NOT NULL
,FR_DATE DATE DEFAULT SYSDATE NOT NULL
,CONSTRAINT US_CODE1_FK FOREIGN KEY(US_CODE1)
REFERENCES USERS(US_CODE)
, CONSTRAINT US_CODE2_FK FOREIGN KEY(US_CODE2)
REFERENCES USERS(US_CODE)
);
--==>> Table FRIENDSμ΄(κ°) μμ±λμμ΅λλ€.
DROP TABLE FRIENDS;
INSERT INTO FRIENDS(FR_CODE, US_CODE1, US_CODE2)
VALUES(1, 1, 2);
INSERT INTO FRIENDS(FR_CODE, US_CODE1, US_CODE2)
VALUES(2, 1, 3);
INSERT INTO FRIENDS(FR_CODE, US_CODE1, US_CODE2)
VALUES(3, 1, 4);
INSERT INTO FRIENDS(FR_CODE, US_CODE1, US_CODE2)
VALUES(4, 1, 5);
SELECT *
FROM FRIENDS;
--==>> 1 1 2 2024-02-20 10:53:48
COMMIT;
--κ·Έλ‘ μΉ΄ν
κ³ λ¦¬ ν
μ΄λΈ μμ±
CREATE TABLE GROUP_CATEGORY
(GC_CODE NUMBER PRIMARY KEY
,GC_NAME VARCHAR2(100) NOT NULL
);
--==>> Table GROUP_CATEGORYμ΄(κ°) μμ±λμμ΅λλ€.
INSERT INTO GROUP_CATEGORY(GC_CODE, GC_NAME)
VALUES (1, 'μ€ν¬μΈ ');
--==>> 1 ν μ΄(κ°) μ½μ
λμμ΅λλ€.
DROP TABLE GROUP_CATEGORY;
-- κ·Έλ£Ή κ°μ€ ν
μ΄λΈ μμ±
CREATE TABLE CREATE_GROUP
(CG_CODE NUMBER PRIMARY KEY
,CG_NAME VARCHAR2(50) NOT NULL
,GC_CODE NUMBER NOT NULL
,CG_INTRO VARCHAR2(100)
,CG_DATE DATE DEFAULT SYSDATE NOT NULL
,CG_PROFILE VARCHAR2(300)
,US_CODE NUMBER NOT NULL
,CONSTRAINT GC_CODE_FK FOREIGN KEY(GC_CODE)
REFERENCES GROUP_CATEGORY(GC_CODE)
,CONSTRAINT US_CODE_FK FOREIGN KEY(US_CODE)
REFERENCES USERS(US_CODE)
);
--==>> Table CREATE_GROUPμ΄(κ°) μμ±λμμ΅λλ€.
INSERT INTO CREATE_GROUP(CG_CODE, CG_NAME, GC_CODE, US_CODE)
VALUES(1, 'κ·Έλ£Ή1', 1, 1);
--==>> 1 ν μ΄(κ°) μ½μ
λμμ΅λλ€.
COMMIT;
--==> μ»€λ° μλ£.
DROP TABLE CREATE_GROUP;
CREATE TABLE RESPONSE
(RS_CODE NUMBER PRIMARY KEY
,RS_STATUS VARCHAR2(30) NOT NULL
);
--==>> Table RESPONSEμ΄(κ°) μμ±λμμ΅λλ€.
INSERT INTO RESPONSE(RS_CODE, RS_STATUS)
VALUES(1, 'μλ½');
INSERT INTO RESPONSE(RS_CODE, RS_STATUS)
VALUES(2, 'κ±°μ ');
INSERT INTO RESPONSE(RS_CODE, RS_STATUS)
VALUES(3, '무μλ΅');
INSERT INTO RESPONSE(RS_CODE, RS_STATUS)
VALUES(4, 'μμ²μ€');
SELECT *
FROM RESPONSE;
DROP TABLE RESPONSE;
CREATE TABLE GROUP_INVITE
(GI_CODE NUMBER PRIMARY KEY
,FR_CODE NUMBER NOT NULL
,CG_CODE NUMBER NOT NULL
,GI_REQUEST DATE DEFAULT SYSDATE
,GI_RESPONSE DATE
,RS_CODE NUMBER
,CONSTRAINT FR_CODE_FK FOREIGN KEY(FR_CODE)
REFERENCES FRIENDS(FR_CODE)
,CONSTRAINT CG_CODE_FK FOREIGN KEY(CG_CODE)
REFERENCES CREATE_GROUP(CG_CODE)
,CONSTRAINT RS_CODE_FK FOREIGN KEY(RS_CODE)
REFERENCES RESPONSE(RS_CODE)
);
--==>> Table GROUP_INVITEμ΄(κ°) μμ±λμμ΅λλ€.
INSERT INTO GROUP_INVITE(GI_CODE, FR_CODE, CG_CODE, RS_CODE)
VALUES(1, 1, 1, 4);
--==>> 1 ν μ΄(κ°) μ½μ
λμμ΅λλ€.
INSERT INTO GROUP_INVITE(GI_CODE, FR_CODE, CG_CODE, RS_CODE)
VALUES(2, 2, 1, 4);
INSERT INTO GROUP_INVITE(GI_CODE, FR_CODE, CG_CODE, RS_CODE)
VALUES(3, 3, 1, 4);
INSERT INTO GROUP_INVITE(GI_CODE, FR_CODE, CG_CODE, RS_CODE)
VALUES(4, 4, 1, 4);
UPDATE GROUP_INVITE
SET GI_REQUEST = TO_DATE('2024-02-23 10:29:23', 'YYYY-MM-DD HH24:MI:SS')
WHERE GI_CODE = 4;
DROP TABLE GROUP_INVITE;
DELETE
FROM GROUP_INVITE
WHERE GI_CODE=1;
COMMIT;
SELECT *
FROM GROUP_INVITE;
--==>> 1 1 1 2024-02-20 12:47:56 4
-- νλ‘μμ ꡬμ±
CREATE OR REPLACE PROCEDURE PRC_GROUP_INVITE
IS
V_GI_REQUEST GROUP_INVITE.GI_REQUEST%TYPE;
V_GI_CODE GROUP_INVITE.GI_CODE%TYPE;
CURSOR CUR_GROUP_INVITE
IS
SELECT GI_CODE
FROM GROUP_INVITE
WHERE GI_RESPONSE IS NULL;
BEGIN
OPEN CUR_GROUP_INVITE;
LOOP
FETCH CUR_GROUP_INVITE INTO V_GI_CODE;
EXIT WHEN CUR_GROUP_INVITE%NOTFOUND;
SELECT GI_REQUEST INTO V_GI_REQUEST
FROM GROUP_INVITE
WHERE GI_CODE = V_GI_CODE;
IF (TRUNC(V_GI_REQUEST + 3) <= SYSDATE) THEN
UPDATE GROUP_INVITE
SET RS_CODE = 3 , GI_RESPONSE = SYSDATE
WHERE GI_CODE = V_GI_CODE;
END IF;
END LOOP;
CLOSE CUR_GROUP_INVITE;
COMMIT;
EXCEPTION
WHEN OTHERS THEN ROLLBACK;
END;
--==>> Procedure PRC_GROUP_INVITEμ΄(κ°) μ»΄νμΌλμμ΅λλ€.
DROP PROCEDURE PRC_GROUP_INVITE;
-- μλν μ
무 μν
BEGIN
DBMS_SCHEDULER.CREATE_PROGRAM
( PROGRAM_NAME => 'GROUP_INVITE_PRG'
, PROGRAM_ACTION => 'PRC_GROUP_INVITE'
, PROGRAM_TYPE => 'STORED_PROCEDURE'
, COMMENTS => 'GROUP_INVITE_PROGRAM'
, ENABLED => TRUE
);
END;
BEGIN
DBMS_SCHEDULER.CREATE_SCHEDULE
( SCHEDULE_NAME => 'SCHEDULE_2_DAY'
, START_DATE => TO_DATE('2024-02-25 10:31:00', 'YYYY-MM-DD HH24:MI:SS')
, END_DATE => NULL
, REPEAT_INTERVAL => 'FREQ=DAILY; INTERVAL=1'
, COMMENTS => 'Every 1 day'
);
END;
BEGIN
DBMS_SCHEDULER.CREATE_JOB
( JOB_NAME => 'GROUP_INVITE_JOB'
, PROGRAM_NAME => 'GROUP_INVITE_PRG'
, SCHEDULE_NAME => 'SCHEDULE_2_DAY'
, ENABLED => TRUE
);
END;
--β» μμ μ²λ¦¬ ꡬ문(νλ‘κ·Έλ¨ μμ )
EXECUTE DBMS_SCHEDULER.DROP_PROGRAM('GROUP_INVITE_PRG', FALSE);
--β» μμ μ²λ¦¬ ꡬ문(μ€μΌμ€ μμ )
EXECUTE DBMS_SCHEDULER.DROP_SCHEDULE('SCHEDULE_2_DAY', FALSE);
--β» μμ μ²λ¦¬ ꡬ문(μ‘ μμ )
EXECUTE DBMS_SCHEDULER.DROP_JOB('GROUP_INVITE_JOB', FALSE);
SELECT *
FROM GROUP_INVITE;
-- ν
μ€νΈ λ° νμΈ
SELECT *
FROM USER_SCHEDULER_JOBS;
--==>>
SELECT *
FROM USER_SCHEDULER_RUNNING_JOBS;
--==>> μ‘°ν κ²°κ³Ό μμ
SELECT *
FROM USER_SCHEDULER_JOB_RUN_DETAILS;
--β» JOBμ LOG μ 보 νμΈ
SELECT *
FROM USER_SCHEDULER_JOB_LOG;
--==>>