Scheduler job oluştur, elle çalıştır, devre dışı bırak ve kaldır
OracleSchedulerKomut
-- 1) Kapali olarak olustur, ozelliklerini ayarla, sonra etkinlestir:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'MUSTERI_APP.GECE_ISTATISTIK',
job_type => 'PLSQL_BLOCK',
job_action => q'[BEGIN DBMS_STATS.GATHER_SCHEMA_STATS(ownname => 'MUSTERI_APP', options => 'GATHER STALE'); END;]',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
enabled => FALSE,
auto_drop => FALSE,
comments => 'Gece stale istatistik toplama');
DBMS_SCHEDULER.SET_ATTRIBUTE('MUSTERI_APP.GECE_ISTATISTIK', 'max_run_duration', INTERVAL '2' HOUR);
DBMS_SCHEDULER.SET_ATTRIBUTE('MUSTERI_APP.GECE_ISTATISTIK', 'logging_level', DBMS_SCHEDULER.LOGGING_FULL);
DBMS_SCHEDULER.ENABLE('MUSTERI_APP.GECE_ISTATISTIK');
END;
/
-- 2) Takvim ifadesini dogrula (sonraki calisma ani):
SET SERVEROUTPUT ON
DECLARE
l_next TIMESTAMP WITH TIME ZONE;
BEGIN
DBMS_SCHEDULER.EVALUATE_CALENDAR_STRING(
calendar_string => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=30; BYSECOND=0',
start_date => SYSTIMESTAMP,
return_date_after => SYSTIMESTAMP,
next_run_date => l_next);
DBMS_OUTPUT.PUT_LINE('Sonraki calisma: ' || l_next);
END;
/
-- 3) Simdi arka planda calistir (takvimi bozmaz):
EXEC DBMS_SCHEDULER.RUN_JOB('MUSTERI_APP.GECE_ISTATISTIK', use_current_session => FALSE);
-- 4) Durum:
SELECT owner, job_name, enabled, state, run_count, failure_count,
last_start_date, next_run_date
FROM dba_scheduler_jobs WHERE owner = 'MUSTERI_APP';
-- 5) Durdur (calisiyorsa) / devre disi birak / kaldir:
-- EXEC DBMS_SCHEDULER.STOP_JOB('MUSTERI_APP.GECE_ISTATISTIK', force => FALSE);
EXEC DBMS_SCHEDULER.DISABLE('MUSTERI_APP.GECE_ISTATISTIK', force => TRUE);
EXEC DBMS_SCHEDULER.DROP_JOB('MUSTERI_APP.GECE_ISTATISTIK', force => TRUE);Ne yapar?
DBMS_SCHEDULER ile takvimli bir PL/SQL işi tanımlar; maksimum süre aşımında olay üreten max_run_duration ve ayrıntılı log seviyesi ayarlanır, takvim ifadesi önceden doğrulanır, iş takvimi bozulmadan elle tetiklenebilir.
Ne zaman kullanılır?
Bakım, ETL, temizlik gibi tekrarlayan DB işlerini cron yerine veritabanı içinde, RAC/Data Guard farkındalığıyla çalıştırmak için.
Dikkat
Ek lisans gerektirmez. start_date'in saat dilimi önemlidir: SYSTIMESTAMP DB sunucusunun TZ'sini alır; yaz saati geçişlerinde kaymaması için açık bölge (ör. 'Europe/Istanbul') kullan. JOB_QUEUE_PROCESSES=0 ise hiçbir job çalışmaz. DISABLE force=>TRUE çalışan örneği durdurmaz, yalnız sonrakileri engeller; çalışanı kesmek için STOP_JOB kullan. Başka şemada job oluşturmak CREATE ANY JOB ister.