Adatbázis Rendszerek II. 7. PLSQL JOB-ok
B IT M A N
25/1
v: 2016.03.04 B IT MAN
Témakörök
A
PL/SQL alapjai
Alprogramok
Csomagok
Triggerek Job-ok
25/2
B IT M A N
ECA (Event, Condition, Action) modell E
Szabály
Kiváltó esemény
A Válasz tevékenység
C Feltétel
JOB
Tárolt eljárás
Időpont 25/3
B IT M A N
Munkakötegek A Job-ok feladatok ütemezésére és az ütemezett feladatok
adminisztrációjára használhatók. Feladatként egy PL/SQL eljárás ütemezhető. A feladat lefuthat egyszer, de rendszeresen ismétlődés is előírható. A feladat végrehajtása lehet sikeres és sikertelen. A sikertelen feladatok végrehajtását az adatbázis-kezelő újra megpróbálja, majd többszöri sikertelen próbálkozás után a feladatot felfüggeszti. A feladatokat magunk is felfüggeszthetjük, vagy törölhetjük. Az ütemezett feladatok végrehajtásáról egy folyamatosan a háttérben futó folyamat (SNP) gondoskodik. A szükséges függvények és eljárások a DBMS_JOB csomagban találhatók.
25/4
B IT M A N
Munkakötegek Feladatokat bárki ütemezhet, aki jogosult a DBMS_JOB
csomag használatára. A már ütemezett feladatok paramétereit csak a feladat tulajdonosa módosíthatja. A feladat tulajdonosa az a felhasználó, aki a feladatot ütemezte. Jogosultság adása a Job használatára:
GRANT EXECUTE ON dbms_job TO username;
25/5
B IT M A N
Munkakötegek működése JOB7
14:05
JOB11
14:25
JOB2
15:00
JOB25
15:05
...
14:25 JOB11 JOB11
16:25
15:00 JOB2
25/6
JOB7 JOB2
14:05 16:00
JOB11
16:25
JOB73
16:30
JOB2
16:00
B IT M A N
Munkakötegek működése A munkakötegek egy várakozó sorban foglalnak helyet. Minden munkaköteghez hozzá van rendelve a következő
futtatási idő. A DBMS folyamatosan figyeli, hogy van-e indítandó munkaköteg. Ha igen, elindítja. A lefutott munkakötegeknél a DBMS meghatározza a következő futás időpontját. Így egy új munkaköteg kerül be a várakozó sorba.
25/7
B IT M A N
A DBMS_JOB csomag utasításai SUBMIT: új feladat behelyezése a várakozó sorba REMOVE: ütemezett feladat ütemezésének megszüntetése CHANGE: ütemezett feladat ütemezési paramétereinek
módosítása WHAT: ütemezett feladat által végrehajtandó utasítás módosítása NEXT_DATE: ütemezett feladat átütemezése más időpontra INSTANCE: ütemezett feladat RAC példányhoz rendelése INTERVAL: ütemezett feladat ismétlési gyakoriságának módosítása BROKEN: ütemezett feladat végrehajtásának felfüggesztése RUN: ütemezett feladat manuális végrehajtása USER_EXPORT: feladat ütemezését eredményező utasítás visszafejtése
25/8
B IT M A N
Munkaköteg létrehozása DBMS_JOB.SUBMIT( job OUT binary_integer, what IN varchar2, next_date IN date default sysdate, interval IN varchar2 default 'null', no_parse IN boolean default false );
A default értékek miatt elmaradhatnak!
job – új munkaköteg száma, what – végrehajtandó PL/SQL kód (alprogram), next_date – a következő végrehajtás időpontja, interval – a végrehajtási időpont növekménye, no_parse – a what objektum szintaktikai helyességének ellenőrzése 25/9
B IT M A N
Job példa declare jobno number; begin dbms_job.submit(jobno, 'alp1;', (sysdate+1/24), 'sysdate+1'); commit; dbms_output.put_line('A job száma: ' || jobno); end;
25/10
B IT M A N
Példák – Időpontok megadása Azonnali indulás, naponkénti végrehajtás:
dbms_job.submit (jobno, 'prg1;', sysdate, 'sysdate+1' ); Azonnali indulás, futás óránként:
Indulás: alapértelmezett!
dbms_job.submit (jobno, 'p1; ', interval => 'sysdate+(1/24)'); Indulás következő egész órakor, futás 10 percenként:
dbms_job.submit(jobno, 'prg1;', trunc(sysdate+(1/24), 'HH'), 'trunc(sysdate+(10/24/60),''MI'')'); Indulás holnap reggel 6-kor, futás minden hétfőn 15-kor:
dbms_job.submit(jobno, 'prg1;', trunc(sysdate+1)+6/24 , 'next_day(trunc(sysdate), ''monday'')+15/24' ); 25/11
B IT M A N
Job-ok kezelése Job-ok kiíratása:
select * from user_jobs; Job eltávolítása:
begin dbms_job.remove(job_szama); end;
25/12
B IT M A N
Autós példa 33. Készítsünk olyan JOB-ot, mely 1 órával a JOB-sorba
kerülés után elindul, ezután 24 óránként lefut, és végrehajtja az auto_m1 nevű tárolt eljárást. declare JobNo number; begin DBMS_JOB.SUBMIT(JobNo, 'auto_m1;', (SYSDATE+1/24), 'SYSDATE+1'); Commit; end; 25/13
B IT M A N
Job-ok kezelése Job-ok kiíratása:
select * from user_jobs; select job, what, next_date, next_sec FROM user_jobs; > Select job,what,next_date,next_sec… JOB 21
WHAT auto_m1;
NEXT_DATE
NEXT_SEC
11-ÁPR.-17
09:21:27
Job törlése:
Exec dbms_job.remove(job_szama); > begin dbms_job.remove(21); end; 25/14
B IT M A N
Indítási időpontok Azonnali indulás: sysdate Következő egész órakor: trunc(sysdate+(1/24), 'HH') Holnap reggel 6-kor: trunc(sysdate+1)+6/24
Egy konkrét időpontban: trunc(to_date('03-MAR-2011
13:00:00'))
25/15
B IT M A N
Ismétlődési periódus Naponként: 'sysdate+1' Minden nap nulla órakor: 'trunc(sysdate + 1)' Óránként: 'sysdate+(1/24)' Egész órakor, óránként: 'trunc(sysdate + 1/24)'
10 percenként: 'trunc(sysdate+(10/24/60),''MI'')' Fél percenként: 'sysdate + 30/86400' Hetente: 'sysdate + 7'
Hétfőnként 15-kor: 'next_day(trunc(sysdate), ''MONDAY'')
+ 15/24' Minden negyedév első csütörtöki napján: 'next_day(add_months(trunc(sysdate, ''Q''), 3), ''THURSDAY'')' 25/16 Nincs ismétlődés: null B IT
MAN
Job változások Az előbbiekben ismertetett csomag már elavult, és időközben
leváltotta az újabb, DBMS_SCHEDULER csomag. A régi módszerrel létrehozott csomagok még működnek az Oracle rendszerekben, de ha megvonják az execution privilege jogot erről a csomagról, akkor már nem használhatók. Az új csomag használata egyszerűbb, az egyes paraméterek könnyebben beállíthatók, sokkal több szolgáltatása van, mint az előzőnek.
25/17
B IT M A N
A DBMS_SCHEDULER csomag Nem csak cron-szerűen (óra alapján) lehet vele job-okat elindítani,
hanem események (event-ek) is képesek elsütni a végrehajtandó tárolt eljárásokat. A tárolt eljárásokat láncokba (chain) tudja fűzni, nem csak egyenként tudja az eljárásokat indítani. A csomag segítségével időablakokat (window) lehet definiálni a SYS sémában, és az adott időablakhoz erőforrásprofilokat (resource plan) lehet rendelni. Az adott ablakban indított job-ok az előre adott erőforrásokhoz fognak hozzáférni.
25/18
B IT M A N
A csomag használata DBMS_SCHEDULER.CREATE_JOB létrehoz egy elemi job-ot DBMS_SCHEDULER.COPY_JOB lemásol egy már létező elemi
job-ot egy másik példányban DBMS_SCHEDULER.CREATE_CHAIN létrehoz egy láncot, azaz tárolt eljárások egy végrehajtási sorozatát valamilyen cél elérése érdekében DBMS_SCHEDULER.ALTER_CHAIN megváltoztatja egy már létrehozott lánc valamely lépését DBMS_SCHEDULER.ALTER_RUNNING_CHAIN megváltoztatja egy éppen futó lánc valamely lépését DBMS_SCHEDULER.CREATE_EVENT_SCHEDULE létrehoz egy esemény-ütemezést (event schedule), ami majd elindít egy job-ot az esemény bekövetkeztekor
25/19
B IT M A N
A csomag használata DBMS_SCHEDULER.ENABLE futtatásra engedélyez egy elemi job-
ot, vagy láncot (chain), vagy időablakot (window), vagy ablakcsoportot (window group) DBMS_SCHEDULER.DISABLE megtiltja egy elemi job, vagy lánc (chain), vagy időablak (window), vagy ablakcsoport (window group) futtatását DBMS_SCHEDULER.SET_JOB_ARGUMENT_VALUE job paraméterének beállítása, megváltztatása DBMS_SCHEDULER.RUN_CHAIN azonnali hatállyal elindít egy végrehajtási láncot (chain) DBMS_SCHEDULER.RUN_JOB azonnali hatállyal elindít egy job-ot DBMS_SCHEDULER.STOP_JOB leállít egy éppen futó job-ot vagy egy job class valamennyi job-ját DBMS_SCHEDULER.DROP_JOB töröl egy job-ot
25/20
B IT M A N
Job indítása declare Régi módszer: jobno number; begin dbms_job.submit(jobno, 'alp1;', (sysdate+1/24), 'sysdate+1'); commit; dbms_output.put_line('A job száma: ' || jobno); end; begin dbms_scheduler.create_job( job_name => 'job_1', job_type => 'stored_procedure', job_action => 'alp1', start_date => sysdate, repeat_interval => 'freq=daily; interval=1', end_date => sysdate + interval '30' day, comments => 'Napi ellenőrzés 30 napig' ); end;
25/21
B IT M A N
Felhasználható kifejezések job_type => – Plsql_block – Stored_procedure – Executable – Chain
repeat_interval => Freq = – Yearly – Monthly – Weekly – Daily – Hourly – Minutely – Secondly
repeat_interval => – Bymonth – Bymonthday – Byweekno – Byyearday – Bydate – Byday – Byhour – Byminute – bysecond
repeat_interval => freq=daily; byhour=9; byminute=30; byday=mon,tue,wed,thu,fri freq=monthly; interval=2; bymonthday=15; byhour=9,17 freq=yearly; bydate=0301,0601,0901,1201; 25/22
B IT M A N
Job-ok kezelése Job-ok kiíratása:
select * from user_jobs; Job eltávolítása:
begin dbms_scheduler.drop_job ('job_neve'); end;
25/23
B IT M A N
Órai feladatok 1.
Készítsen egy tárolt eljárást (VDbKiir), mely kiírja a Vasarlas tábla rekordjainak számát. Készítsen egy JOB-ot, mely azonnal elindul, 1 percenként ismétlődik, és végrehajtja a DbKiir eljárást. Írassa ki a futó JOB-ok listáját. Törölje le a JOB-ot.
Készítsen egy tárolt eljárást (BevJ), mely kiírja az aznapi bevételt. Készítsen egy JOB-ot, mely minden egész órakor lefut. Írassa ki a futó JOB-ok listáját. Törölje le a JOB-ot.
25/24
B IT M A N
VÉGE 25/25
B IT M A N