λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
ORACLE/JOB_SCHEDULER

● JOB_SCHEDULER

by λ‹‰λ„€μž„μ—†λŠ” λ‹‰λ„€μž„ 2024. 2. 19.
TOP

λͺ©μ°¨

    β– β– β–  였라클 작 μŠ€μΌ€μ€„λŸ¬(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;
    --==>>