Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

PL/SQL gyakorlás Kalmár György.

Hasonló előadás


Az előadások a következő témára: "PL/SQL gyakorlás Kalmár György."— Előadás másolata:

1 PL/SQL gyakorlás Kalmár György

2 1. feladat Írj PL/SQL programot, amely egy, a felhasználótól bekért életkortól idősebb személyekről kiírja: Nevüket Születési évüket és hónapot Városukat A megoldásban használj gyűjtőtáblát az adatok tárolására.

3 Megoldás set serveroutput on; DECLARE TYPE eredmeny_rec IS RECORD(szemelynev SZEMELY.NEV%TYPE, szuletes SZEMELY.SZULETESIDATUM%TYPE, varosnev VAROSOK.NEV%TYPE); TYPE eredmeny_tab IS TABLE OF eredmeny_rec INDEX BY PLS_INTEGER; eredmeny eredmeny_tab ; bekert_eletkor NUMBER(3); BEGIN bekert_eletkor := &bekeres; SELECT SZEMELY.NEV, SZEMELY.SZULETESIDATUM,VAROSOK.NEV BULK COLLECT INTO eredmeny FROM SZEMELY,VAROSOK WHERE 2016-EXTRACT(YEAR FROM SZEMELY.SZULETESIDATUM)> bekert_eletkor AND SZEMELY.IRSZ=VAROSOK.IRSZ AND SZEMELY.ORSZAG=VAROSOK.ORSZAG; FOR i IN eredmeny.FIRST..eredmeny.LAST LOOP IF eredmeny.EXISTS(i) THEN DBMS_OUTPUT.PUT_LINE(eredmeny(i).szemelynev||' a '||eredmeny(i).varosnev||' varosban lakik. Szuletett:'||TO_CHAR(eredmeny(i).szuletes,'YYYY.MM')); END IF; END LOOP; END; /

4 2. feladat Írj PL/SQL programot, amely a városokhoz kiszámolja az azokban élők átlagos életkorát. Az átlagot egy függvény számolja ki, amelynek bemenő paramétere a feldolgozandó város neve. Az városokat tartalmazó táblán explicit kurzorral lépkedj végig. Az eredményeket jelenítsd is meg. Ugyanezt a feladatot oldd meg egy gyűjtőtábla és egy SELECT...INTO utasítás segítségével.

5 Megoldás (a) set serveroutput on; DECLARE atlag_valt NUMBER := 0; CURSOR varosok_cursor IS SELECT NEV FROM VAROSOK; FUNCTION atlag_fgv(varosnev IN VAROSOK.NEV%TYPE) RETURN NUMBER IS atlag NUMBER := 0; BEGIN SELECT AVG(2016-EXTRACT(YEAR FROM SZEMELY.SZULETESIDATUM)) INTO atlag FROM SZEMELY,VAROSOK WHERE VAROSOK.NEV=varosnev AND SZEMELY.IRSZ=VAROSOK.IRSZ AND SZEMELY.ORSZAG=VAROSOK.ORSZAG; RETURN atlag; END; FOR aktualis_varos IN varosok_cursor LOOP atlag_valt := atlag_fgv(aktualis_varos.nev); DBMS_OUTPUT.PUT_LINE(aktualis_varos.nev||' varosban az atlagos eletkor: '||atlag_valt); END LOOP; /

6 Megoldás (b) set serveroutput on; DECLARE TYPE varos_stat_record IS RECORD(varosnev VAROSOK.NEV%TYPE,atlag_eletkor NUMBER); TYPE varos_stat_tabla IS TABLE OF varos_stat_record INDEX BY PLS_INTEGER; varosok_stat varos_stat_tabla; BEGIN SELECT VAROSOK.NEV,AVG(2016-EXTRACT(YEAR FROM SZEMELY.SZULETESIDATUM)) BULK COLLECT INTO varosok_stat FROM SZEMELY,VAROSOK WHERE SZEMELY.IRSZ=VAROSOK.IRSZ AND SZEMELY.ORSZAG=VAROSOK.ORSZAG GROUP BY VAROSOK.NEV; FOR i IN varosok_stat.FIRST..varosok_stat.LAST LOOP IF varosok_stat.EXISTS(i) THEN DBMS_OUTPUT.PUT_LINE(varosok_stat(i).varosnev||' varosban az átlagos életkor: '||varosok_stat(i).atlag_eletkor); END IF; END LOOP; END; /

7 3. feladat Írj PL/SQL programot, amely meghatározza, hogy átlagosan a folyómenti vagy a nem folyómenti városokban élnek-e tovább az emberek. A program foglalkozzon hibakezelésekkel.

8 Megoldás set serveroutput on; DECLARE atlag_folyomenti NUMBER; atlag_nem_folyomenti NUMBER; BEGIN SELECT AVG(EXTRACT(YEAR FROM sysdate)-EXTRACT(YEAR FROM SZEMELY.SZULETESIDATUM)) INTO atlag_folyomenti FROM SZEMELY,VAROSOK WHERE VAROSOK.FOLYOMENTIE=1 AND SZEMELY.IRSZ=VAROSOK.IRSZ AND SZEMELY.ORSZAG=VAROSOK.ORSZAG; SELECT AVG(EXTRACT(YEAR FROM sysdate)-EXTRACT(YEAR FROM SZEMELY.SZULETESIDATUM)) INTO atlag_nem_folyomenti FROM SZEMELY,VAROSOK WHERE VAROSOK.FOLYOMENTIE=0 AND SZEMELY.IRSZ=VAROSOK.IRSZ AND SZEMELY.ORSZAG=VAROSOK.ORSZAG; DBMS_OUTPUT.PUT_LINE('Folyómenti átlag:'||atlag_folyomenti); DBMS_OUTPUT.PUT_LINE('Nem folyómenti átlag:'||atlag_nem_folyomenti); IF atlag_folyomenti>atlag_nem_folyomenti THEN DBMS_OUTPUT.PUT_LINE('Folyómenti városokban az átlagos életkor magasabb.'); ELSE DBMS_OUTPUT.PUT_LINE('Nem folyómenti városokban az átlagos életkor magasabb.'); END IF; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Lekérdezés eredménye üres.'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Lekérdezés eredménye nem egy sor.'); END; /

9 4. feladat Hozz létre egy függvényt adatbázis objektumként, amelynek bemenő paramétere egy város neve és egy logikai érték. Ha a logikai érték igaz,kiírja a város adatait, ha hamis, akkor nem. Visszatérési értéke a város irányítószáma. A függvény felhasználásával írj PL/SQL programot, amely a 60 évnél idősebb személyeknél kiírja a városuk adatait is, ellenkező esetben csak a személy adatait.

10 Megoldás CREATE FUNCTION varoskiir(varosnev_p IN VAROSOK.NEV%TYPE, kiir BOOLEAN:=FALSE) RETURN VAROSOK.IRSZ%TYPE IS varos_rec VAROSOK%ROWTYPE; BEGIN SELECT * INTO varos_rec FROM VAROSOK WHERE NEV=varosnev_p; IF kiir THEN DBMS_OUTPUT.PUT_LINE(varos_rec.nev||' '||varos_rec.irsz||' '||varos_rec.orszag); END IF; RETURN varos_rec.irsz; END;

11 Megoldás set serveroutput on; DECLARE CURSOR szemelyek IS SELECT * FROM SZEMELY; varosnev VAROSOK.NEV%TYPE; irsz_valt VAROSOK.IRSZ%TYPE; BEGIN FOR aktualis_szemely IN szemelyek LOOP SZEMELY_KIIR(aktualis_szemely); --már léteznie kell az órai anyagból IF 2016-EXTRACT(YEAR FROM aktualis_szemely.SZULETESIDATUM) > 60 THEN SELECT VAROSOK.NEV INTO varosnev FROM SZEMELY,VAROSOK WHERE SZEMELY.SZIGSZ=aktualis_szemely.SZIGSZ AND VAROSOK.IRSZ=SZEMELY.IRSZ AND VAROSOK.ORSZAG=SZEMELY.ORSZAG; irsz_valt := VAROSKIIR(varosnev,TRUE); END IF; END LOOP; END; /

12 5. feladat Írj PL/SQL programot, amely a hónapokhoz születési statisztikát készít (hányan születtek az adott hónapban). A megvalósítás használjon WHILE vezérlési szerkezetet a hónapok bejárásához.

13 Megoldás set serveroutput on; DECLARE honap_szamlalo PLS_INTEGER DEFAULT 1; szulettek PLS_INTEGER := 0; BEGIN WHILE honap_szamlalo<13 LOOP SELECT COUNT(*) INTO szulettek FROM SZEMELY,VAROSOK WHERE SZEMELY.IRSZ=VAROSOK.IRSZ AND SZEMELY.ORSZAG=VAROSOK.ORSZAG AND EXTRACT(MONTH FROM SZEMELY.SZULETESIDATUM)=honap_szamlalo; DBMS_OUTPUT.PUT_LINE('A '||honap_szamlalo||'. honapban '||szulettek||' szemely szuletett.'); honap_szamlalo := honap_szamlalo+1; END LOOP; END; /

14 6. feladat Írj PL/SQL programot, amely egy gyűjtőtáblában elkészíti a 20. század évtizedekre lebontott születési statisztikáit (hányan születtek az adott évtizedben). A gyűjtőtábla elkészítése után járd be azt és írd ki a statisztikai adatokat. Ügyelj a kivételkezelésre.

15 set serveroutput on; DECLARE evtized_szamlalo PLS_INTEGER := 0; szulettek PLS_INTEGER := 0; TYPE evtized_stat IS RECORD(evtized PLS_INTEGER,szulettek PLS_INTEGER); TYPE evtized_stat_tabla IS TABLE OF evtized_stat INDEX BY PLS_INTEGER; stat_20sz evtized_stat_tabla; BEGIN WHILE evtized_szamlalo<10 LOOP SELECT COUNT(*) INTO szulettek FROM SZEMELY,VAROSOK WHERE SZEMELY.IRSZ=VAROSOK.IRSZ AND SZEMELY.ORSZAG=VAROSOK.ORSZAG AND EXTRACT(YEAR FROM SZEMELY.SZULETESIDATUM) BETWEEN 1900+evtized_szamlalo*10 AND 1900+evtized_szamlalo*10+9; stat_20sz(evtized_szamlalo).evtized := evtized_szamlalo; stat_20sz(evtized_szamlalo).szulettek := szulettek; evtized_szamlalo := evtized_szamlalo+1; END LOOP; FOR i IN stat_20sz.FIRST..stat_20sz.LAST LOOP IF stat_20sz.EXISTS(i) THEN DBMS_OUTPUT.PUT_LINE('A 20. szazad '||(stat_20sz(i).evtized+1)||'. evtizedeben '||stat_20sz(i).szulettek||' szemely szuletett.'); END IF; EXCEPTION WHEN NO_DATA_FOUND OR TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('Lekérdezés hiba.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('Egyéb hiba.'); END; /


Letölteni ppt "PL/SQL gyakorlás Kalmár György."

Hasonló előadás


Google Hirdetések