Adatbázis Rendszerek II. 7. PLSQL JOB-ok 25/1B IT MAN B IT v: 2016.03.04 MAN
Témakörök A PL/SQL alapjai Alprogramok Csomagok Triggerek Job-ok 25/2 B IT MAN
ECA (Event, Condition, Action) modell E Szabály A Kiváltó esemény C Feltétel Válasz tevékenység JOB Tárolt eljárás Időpont 25/3 B IT MAN
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 MAN
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 MAN
Munkakötegek működése JOB7 14:05 14:25 JOB11 14:25 JOB2 15:00 JOB25 15:05... JOB7 JOB2 14:05 16:00 JOB11 16:25 JOB11 JOB11 16:25 15:00 JOB2 JOB2 16:00 JOB73 16:30 25/6 B IT MAN
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 MAN
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 MAN
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 MAN
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 MAN
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 MAN
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 MAN
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 MAN
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 WHAT NEXT_DATE NEXT_SEC 21 auto_m1; 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 MAN
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 MAN
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 MAN
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 MAN
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 MAN
A csomag használata DBMS_SCHEDULER.ENABLE futtatásra engedélyez egy elemi jobot, 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 MAN
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 MAN
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 MAN
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 MAN
Ó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 MAN
VÉGE VÉGE 25/25 B IT MAN