Adatbázis Rendszerek II. 2. Gy: PLSQL 1. B I v: T 2015.02.22 M A N 1/75
A PL/SQL alapjai A PL/SQL alapjai Változók DBMS_OUTPUT Vezérlési szerkezetek Tömbök Tárolt rutinok kezelése 2/75
Tárolt eljárások Tárolt eljárás = PSM = Persistent Stored Module (tartósan tárolt modul): adatbázisobjektumként tárolt algoritmikus program, amely SQL utasításokat is tartalmazhat. Szintaxisa az SQL algoritmikus kiterjesztésének tekinthető. A tárolt eljárásokra rendszerenként más-más elnevezést használnak, és szintaxisuk is többé-kevésbé eltér: 3/75 SQL:1999 szabvány: PSM = Persistent Stored Modules Oracle: PL/SQL = Procedural Language extension to SQL SyBase, Microsoft SQL Server: Transact-SQL Informix: SPL = Stored Procedural Language MySQL: MySQL Stored Routines (5.1 verziótól), Stored Program Language (SPL)
Tárolt eljárások Tárolt eljárások előnyei: Az eljárások a szerveren vannak, így nem kell üzeneteket küldözgetni az SQL utasítások végrehajtásakor a kliens és a szerver között. Az eljárások elemzése egyszer történik meg. Az eljárásokra ugyanolyan biztonsági intézkedések vonatkoznak, mint az adatbázisban tárolt többi adatra. 4/75
A PL/SQL alapjai PL/SQL : az Oracle SQL kiegészítése a procedurális elemek definiálására PL/SQL programok építőköve a PL/SQL blokk DECLARE BEGIN EXCEPTION Deklarációs rész Végrehajtási rész (kód rész) Hibakezelő rész 5/75 END;
A PL/SQL alapjai Blokk típusok: Névtelen blokk: Minden futtatáskor lefordítja a rendszer, nem tárolódik le, nem lehet rá hivatkozni. Nevesített blokk: Címkével azonosított blokk, amelynek címkéjére feltételes vagy ugró utasításokból hivatkozhatunk. Alprogramok: Tárolt függvények és eljárások, melyek nevükkel azonosítottak, és bármikor meghívhatók. Triggerek: Tárolt, névvel hívható blokkok, melyek automatikusan lefutnak bizonyos műveletek esetén. Job-ok: Tárolt, névvel hívható blokkok, melyek megadott időpontokban automatikusan lefutnak. 6/75
Blokk típusok Névtelen Eljárás Függvény [DECLARE] BEGIN -- utasítások [EXCEPTION] END; PROCEDURE név IS BEGIN -- utasítások [EXCEPTION] END; FUNCTION név RETURN adattípus IS BEGIN -- utasítások RETURN érték; [EXCEPTION] END; 7/75
A PL/SQL alapjai Névtelen blokk: declare pi constant NUMBER(9,7) := 3.1415926; sugar INTEGER(5); terulet NUMBER(14,2); begin sugar := 3; terulet := pi * power(radius, 2); Változó deklarációk Utasítások INSERT INTO korok VALUES (sugar, terulet); end; 8/75
A PL/SQL alapjai <<Korok_beszurasa>> declare Nevesített blokk, címkével pi constant NUMBER(9,7) := 3.1415926; terulet NUMBER(14,2); cursor meret_cursor is SELECT * FROM meretek; meret meret_cursor%rowtype; begin open meret_cursor; loop fetch meret_cursor into meret; terulet := pi * power(meret.sugar, 2); INSERT INTO korok VALUES (meret.sugar,terulet); exit when meret_cursor%notfound; end loop; close meret_cursor; end; 9/75
A PL/SQL alapjai Az utasításokat ; zárja le Kis- és nagybetű egyenértékű (az utasításokban a kulcsszavakat szoktuk nagybetűvel írni, de nem kötelező!) Comment REM vagy --, többsoros /* */ Használat előtt deklarálni kell a változókat, azonosítókat, eljárásokat! ** hatványozás,!= nem egyenlő, karakterlánc összefűzés Egy PL/SQL program egy vagy több blokkból áll, a blokkok egymásba ágyazhatók 10/75
A PL/SQL alapjai Deklarációs rész Változók Konstansok Cursor-szerkezetek Hibakezelési elemek Törzs rész Utasítások SQL parancsok Vezérlési elemek Hibakezelő rész Hibakezelő műveletek leírása 11/75
A PL/SQL alapjai A PL/SQL alapjai Változók DBMS_OUTPUT Vezérlési szerkezetek Tömbök Tárolt rutinok kezelése 12/75
Változók Programváltozók: adatbázisban létező típusú változók Típusmásolással létrehozott változók: Egy adott tábla egy adott oszlopával megegyező típus (oszlopváltozó) Egy adott tábla rekordszerkezetével megegyező típus (sorváltozó) 13/75
Deklarációs rész DECLARE változóazonosító típus(attribútum) := kifejezés; Programváltozók: NUMBER: Numerikus érték, opcionálisan kijelölhet a teljes ábrázolási hossz és a tizedes jegyek darabszáma CHAR: Szöveges érték, opcionálisan kijelölhető a karakterek darabszáma DATE: dátum típus BOOLEAN: logikai adattípus 14/75
DECLARE (példák) Numerikus érték, 8 számjegy, 2 tizedes, induló érték 3 ar NUMBER(8,2) := 3; Szöveges érték, 25 karakter nev CHAR(25); Dátum érték, kezdértéke 2011. szeptember 28. datum DATE := 11-SEPT.-28 ; Logikai érték reszvetel BOOLEAN; Konstansok megadása ARFOLYAM CONSTANT NUMBER(6,1) := 103.2; 15/75
DECLARE (példák) Típusmásolással létrehozott változók: Oszlopváltozó: 16/75 DECLARE v1 tábla.mező%type -- v1 auto.rendszam%type; A megadott tábla megadott oszlopának típusát veszi fel Sorváltozó: DECLARE v2 tábla%rowtype -- v2 auto%rowtype; A megadott tábla rekordszerkezetével megegyező típusú változó Hivatkozás egy elemére: v2.rendszam
DECLARE (példák) DECLARE v_sor vevo%rowtype; BEGIN SELECT * INTO v_sor FROM vevo WHERE partner_id = 21; DBMS_OUTPUT.PUT_LINE(v_sor.MEGNEVEZES); END; DBMS_OUTPUT.PUTLINE Szöveg kiírása a konzolra. 17/75
Autós példa Adott a következő tábla, a feladatok ezen értelmezettek: rsz tipus auto szín kor ar 18/75
Autós példa 1. PL/SQL blokk írása egy autó rekord felvitelére, ahol a mezőértékeket memóriaváltozókon keresztül adjuk meg, melyek típusa az AUTO tábla mezőinek típusával megegyező. DECLARE a auto.rsz%type := 'abc124'; b auto.tipus%type:= 'fiat' ; c auto.szin%type := 'piros'; d auto.kor%type := 3; e auto.ar%type := 18000000; BEGIN INSERT INTO AUTO VALUES (a, b, c, d, e); END; 19/75
Autós példa 2. PL/SQL blokk írása, mely egy memóriaváltozóban megadott kornál idősebb autók árát csökkenti 10%-al. DECLARE x NUMBER(2) := 7; BEGIN UPDATE AUTO SET ar=ar*0.9 WHERE kor >= x; END; 20/75
Autós példa 3. PL/SQL blokk írása, memóriaváltozóban megadott korú autók törlésére. DECLARE x AUTO.KOR%TYPE := 2; BEGIN DELETE FROM AUTO WHERE kor = x; END; 21/75
Autós példa 4. PL/SQL blokk írása autók átlagárának lekérdezésére és a napló táblában történő eltárolására. DECLARE x AUTO.AR%TYPE; BEGIN SELECT AVG(ar) INTO x FROM AUTO; INSERT INTO naplo VALUES (x, sysdate, user); END; 22/75
A PL/SQL alapjai A PL/SQL alapjai Változók DBMS_OUTPUT Vezérlési szerkezetek Tömbök Tárolt rutinok kezelése 23/75
DBMS_OUTPUT Használatát a SET SERVEROUTPUT ON SQL*Plus paranccsal engedélyezni kell! Hasznos parancsok: ACCEPT: változó értékének beolvasása PUT: Kiírás ugyanabba a sorba NEW_LINE: Sortörés PUT_LINE: Kiírás külön sorba 24/75
DBMS_OUTPUT (Példa) SET SERVEROUTPUT ON ACCEPT nev PROMPT 'Kérem adja meg a nevét: ' DECLARE szoveg varchar2(50); BEGIN szoveg := nev ' sikeresen '; szoveg := CONCAT('&nev',' sikeresen végrehajtotta a programot!'); DBMS_OUTPUT.PUT_LINE (szoveg); END; 25/75
Autós példa 5. PL/SQL blokk írása autók átlagárának lekérdezésére és kiíratása. DECLARE x AUTO.AR%TYPE; BEGIN SELECT AVG(ar) INTO x FROM AUTO; DBMS_OUTPUT.PUT_LINE(x); END; 26/75
Autós példa 6. PL/SQL blokk írása az autók darabszámának lekérdezésére és kiíratása. DECLARE x int; BEGIN SELECT count(*) INTO x FROM AUTO; DBMS_OUTPUT.PUT_LINE('Autók száma: ' x); END; 27/75
Autós példa 7. Tárolt eljárás készítése a 10 évnél idősebb autók törlésére. Fix feltétel! create procedure torol as begin delete from auto where kor>10; end; 28/75
Autós példa 8. Tárolt eljárás készítése paraméterként megadott kornál idősebb autók törlésére. create or replace procedure torol (x in number) as begin delete from auto where kor>x; end; 29/75
Példa 9. Tárolt függvény készítése, mellyel egy numerikus érték növelhető 5-el. create function novel5 (x in number) return number as begin return x+5; end; 30/75
Autós példa 10. Plsql blokk írása az előző függvény meghívására és a megnövelt érték napló táblában történő eltárolására. declare x number(6) := 12; ujx number(6); begin ujx := novel5(x); insert into naplo values(user, sysdate, ujx); end; 31/75
Példa 11. Tárolt függvény készítése, mellyel egy numerikus érték növelhető 5-el. create function novel5 (x in number) return number as begin end; return x+5; > variable szam number > execute :szam := novel5(13); A PL/SQL eljárás sikeresen befejeződött. > print szam SZAM declare x number(6) := 12; begin x := novel5(13); dbms_output.put_line(x); end; 32/75 18
Példa 11b. Tárolt függvény készítése, mellyel egy numerikus érték növelhető 5-el. create function novel5 (x in number) return number as begin return x+5; end; > Select novel5(13) from dual; NOVEL5(13) 18 Select novel5(13) from dual; 33/75
Példa 12. Tárolt eljárás készítése, mellyel egy numerikus érték növelhető 5-el. create or replace procedure novelot (x in number) as ujx number(6); begin ujx := x+5; dbms_output.put_line(ujx); end; > execute novel(27); A PL/SQL eljárás sikeresen befejeződött. begin novelot(27); end 34/75 UJX 32
Példa 13. Tárolt eljárás készítése a legmagasabb ár kiírására az autó táblából. create or replace procedure maxar as x number(8); begin select max(ar) into x from auto; dbms_output.put_line(x); end; begin maxar; end 35/75
Példa 13b. Tárolt függvény készítése a legmagasabb ár lekérésére az autó táblából. create or replace function maxarfgv return int as x int; begin 36/75 select max(ar) into x from auto; return(x); end; declare x int; begin x := maxarfgv; dbms_output.put_line(x); end; select maxarfgv from dual;
A PL/SQL alapjai A PL/SQL alapjai Változók DBMS_OUTPUT Vezérlési szerkezetek Tömbök Tárolt rutinok kezelése 37/75
Vezérlési szerkezetek - IF IF feltétel1 THEN utasítások1 ELSIF feltétel2 THEN utasítások2 ELSIF feltétel3 THEN utasítások3 ELSE utasításokn END IF; 38/75
IF (Példa) DECLARE v_avgber munkatars.ber%type; szoveg VARCHAR2(50); begin SELECT AVG(ber) INTO v_avgber FROM munkatars; IF v_avgber < 100000 THEN szoveg:='kevesebb mint százezer.'; ELSIF (v_avgber > 100000) AND (v_avgber <= 200000) THEN szoveg:='százezer és kétszázezer közötti.'; ELSE szoveg:='kétszázezer fölött van.'; END IF; DBMS_OUTPUT.PUT_LINE('Az átlagbér' szoveg); END; 39/75
IF (Példa) Eljárás, mely ha nem létező rendszámot kap paraméterül, akkor hibaüzenetet ír a képernyőre, egyébként kiírja az autó típusát. create or replace procedure rsz_tip (rszbe char) is x int := 0; t varchar(30); begin select count(*) into x from auto where rsz=rszbe; if x = 0 then dbms_output.put_line('nem létező rendszám: ' rszbe); else select tipus into t from auto where rsz=rszbe; dbms_output.put_line('az autó típusa: ' t); end if; end; 40/75 begin rsz_tip('aaa100'); end; begin rsz_tip('jrz932'); end;
Vezérlési szerkezetek - Ciklusok Alap ciklus (LOOP ciklus) WHILE ciklus FOR ciklus 41/75
Vezérlési szerkezetek - LOOP LOOP utasítások END LOOP; Kilépés: EXIT; Feltétellel együtt: EXIT WHEN feltétel; x := 0; LOOP x := x+1; EXIT WHEN x=20; END LOOP; -- Eredmény: x = 20 42/75
Loop (Példa) DECLARE 43/75 v_sorsz vevo.partner_id%type := 21; v_megnev vevo.megnevezes%type; BEGIN LOOP SELECT megnevezes INTO v_megnev FROM vevo WHERE partner_id = v_sorsz; DBMS_OUTPUT.PUT_LINE(v_megnev); v_sorsz := v_sorsz +1; EXIT WHEN v_sorsz > 28; END LOOP; END;
Vezérlési szerkezetek -WHILE WHILE feltétel LOOP utasítások END LOOP; x := 0; WHILE x<20 LOOP x := x+1; END LOOP; -- Eredmény: x = 20 44/75
Vezérlési szerkezetek - FOR FOR index IN induló_egész.. záró_egész LOOP utasítások END LOOP; Indexváltozó: minden értéket felvesz a tartományon belül. Nem szükséges külön deklarálni Automatikusan NUMBER típusú Konstansként látható és használható a cikluson belül x := 0; FOR i IN 1..10 LOOP x := x + i; END LOOP 45/75 -- Eredmény: x = 55 (1+2+ +10=55)
For (példa) FOR szam IN 1..500 LOOP INSERT INTO gyokok VALUES (szam, SQRT(szam)); END LOOP; 46/75
A PL/SQL alapjai A PL/SQL alapjai Változók DBMS_OUTPUT Vezérlési szerkezetek Tömbök Tárolt rutinok kezelése 47/75
Tömbök Kb. mint a C és a Java nyelvekben alkalmazott tömbök A tömb indexnek a kezdő értéke mindig egy, és mindig eggyel növekszik. A tömb típus deklarálása: TYPE tömbnév IS VARRAY(méret) OF elemtípus; Az elemtípus alap-, rekord, vagy objektum típusú lehet. Type auto_t1 is varray(10) of int; Type auto_t2 is varray(10) of auto.rsz%type; Type auto_t3 is varray(10) of auto%rowtype; Type auto_t4 is varray(10) of auto; 48/75
Tömbök Értékadás: Declare Type t1tip is varray(3) of int; t1 t1tip; Begin t1:=t1tip(13,55,32); Értékadás: Declare Type t1tip is varray(100) of int; t1 t1tip := t1tip(); Begin t1.extend(3); t1(1):=13; t1(2):=55; t1(3):=32; 49/75
Tömb kezelése FOR ciklussal DECLARE type nevtomb IS VARRAY(5) OF VARCHAR2(10); type ponttomb IS VARRAY(5) OF INTEGER; nevek nevtomb; pontok ponttomb; osszdb integer; BEGIN nevek := nevtomb('bitman', 'Nórika', 'Pistike', 'Tökmag', 'Zsuzsika'); pontok:= ponttomb(98, 97, 78, 87, 92); osszdb:= nevek.count; dbms_output.put_line('összesen ' osszdb ' darab hallgató'); FOR i in 1.. osszdb LOOP dbms_output.put_line('hallgató: ' nevek(i) ' Pontszám: ' pontok(i)); END LOOP; END; 50/75
A PL/SQL alapjai A PL/SQL alapjai Változók DBMS_OUTPUT Vezérlési szerkezetek Tömbök Tárolt rutinok kezelése 51/75
Tárolt alprogramok létrehozása 52/75 Szövegszerkesztő Figyelmeztetés: A függvény létrehozása fordítási hibákkal fejeződött be. Show errors Az eljárás létrejött. Szerkesztés 1 2 Text fájl Tárolás az adatbázisban Forráskód Fordítás P-kód Futtatás
Tárolt rutinok kezelése Bár a rendszer megkülönbözteti az eljárást és a függvényt, nem lehet ugyanazzal a névvel eljárást és függvényt is létrehozni! Létrehozott alprogramok nevének listáztatása: select * from user_procedures; 53/75
Tárolt rutinok kezelése SELECT * FROM ALL_OBJECTS WHERE OBJECT_TYPE IN ('FUNCTION','PROCEDURE','PACKAGE') 54/75
Tárolt rutinok kezelése Alprogram tartalmának (sorainak) kiíratása: select text from user_source where name = 'TOROL' order by line; Alprogramok törlése: Drop procedure eljárásnév; Drop function függvénynév; Ha függvényt próbálunk eljárásként törölni: Drop procedure r_szin; 55/75
Alprogramok paraméterei IN paraméter alapértelmezett OUT paraméter visszatérő értékhez INOUT be-kimenő érték IN paraméter OUT paraméter IN OUT paraméter DECLARE Értékátadás: parancssori paraméterekkel BEGIN EXCEPTION END; Tetszőleges típusúak, kijelentkezéskor törlődnek Deklarálás: DECLARE változó típus := kezdőérték; Pl.: declare szam int := 0; 56/75
Alprogramok paraméterei Példa IN és OUT paraméterre create or replace procedure negyzet1 (a in number, b out number) is begin b := a*a; end; declare a int:=5; b int; begin negyzet1(a, b); dbms_output.put_line(b); end; 57/75
Alprogramok paraméterei Példa IN OUT paraméterre create procedure negyzet2 (a in out int) is begin a := a*a; end; declare a int:=5; begin negyzet2(a); dbms_output.put_line(a); end; 58/75
Eljárások lefuttatása SQL Commands Paraméter nélküli eljárások elindítása: begin adb; end; begin adb(); end; Csak IN paraméterek esetén: IN paraméter OUT paraméter IN OUT paraméter DECLARE BEGIN EXCEPTION IN és OUT paraméterek esetén: 59/75 begin torol(10); end; END; declare vp int; begin negyzet(5, vp); dbms_output.put_line(vp); end;
Függvények lefuttatása SQL Commands Függvények elindítása: változó := fgv_név(in paraméterek); IN paraméter DECLARE BEGIN RETURN érték EXCEPTION select szindb( piros ) from dual; END; declare x number(6) := 12; begin x := szindb( piros ); dbms_output.put_line(x); end; 60/75 Ha a függvény végrehajtási részében DML művelet van, ezt a megoldást kell használni.
MiniBolt ER modell Kkod Nev Tkod Nev Ar Kategória K-T Termék Leiras Sorsz Vásárlás Datum Darab Nev VID Vásárló Cim Fizmod 61/75
MiniBolt struktúra modell Kategória Kkod Nev Termék Kategoria Tkod Nev Ar Leiras Vásárlás Tkod Sorszam Idopont Darab VID Vásárló VID Nev Cim Fizmod 62/75
Órai feladatok 1. Hozza létre a MiniBolt adattábláit: Create table Kategoria( Kkod char(3) primary key, Nev char(20)); Create table Termek( Tkod char(3) primary key, Nev char(20), Ar numeric(6), Leiras char(20), Kategoria char(3) not null references Kategoria); 63/75
Órai feladatok 1. Hozza létre a MiniBolt adattábláit: Create table Vasarlo( VID char(3) primary key, Nev char(20), Cim char(20), Fizmod char(4)); Create table Vasarlas( Sorsz numeric(5), Datum date, Tkod char(3) not null references Termek, Darab numeric(4), VID char(3) not null references Vasarlo, unique (Sorsz, Datum) ); 64/75
Órai feladatok 2. Vigye fel az alábbi rekordokat: 65/75 insert into Kategoria values('k01', 'Kaja'); insert into Kategoria values('k02', 'Pia'); insert into Kategoria values('k03', 'Ruha'); insert into Kategoria values('k04', 'Egyéb'); insert into Vasarlo values('v01', 'Kék Alma', 'Mc. Kék u.12', 'kp'); insert into Vasarlo values('v02', 'Zöld Galamb', 'Mc. Hó u.72', 'atut'); insert into Vasarlo values('v03', 'Fekete Farkas', 'Mc. Vas u.25', 'bkar'); insert into Vasarlo values('v04', 'Kovács Éva', 'Eger. Lap u.4', 'bkar'); insert into Vasarlo values('v05', 'Kis Béla', 'Eger. Bé u.9', 'kp'); insert into Vasarlo values('v06', 'Kis Jenő', 'Eger. Cé u.11', 'atut'); insert into Vasarlo values('v07', 'Kis Noé', 'Eger. Cé u.11', 'kp'); insert into Vasarlo values('v08', 'Kis Tas', 'Eger. Cé u.11', 'bkar'); insert into Vasarlo values('v09', 'Hó Manó', 'Nyék. Tó u.74', 'atut'); insert into Vasarlo values('v10', 'Ká Rozi', 'Nyék. Ká u.5', 'kp'); insert into Vasarlo values('v11', 'Víz Jenő', 'Mc. Út u.39', 'bkar');
Órai feladatok 2. Vigye fel az alábbi rekordokat: insert into Termek values('t01', 'sör', 200, 'világos', 'k02'); insert into Termek values('t02', 'bor', 200, 'vörös', 'k02'); insert into Termek values('t03', 'zsömle', 20, 'kerek', 'k01'); insert into Termek values('t04', 'zsír', 100, 'disznó', 'k01'); insert into Termek values('t05', 'paprika', 100, 'zöld', 'k01'); insert into Termek values('t06', 'csipsz', 300, 'sajtos', 'k01'); insert into Termek values('t07', 'csipsz', 400, 'retkes', 'k01'); insert into Termek values('t08', 'mackó felső', 8000, 'Adidasss', 'k03'); insert into Termek values('t09', 'mackó alsó', 8000, 'Adidasss', 'k03'); insert into Termek values('t10', 'mackó póló', 5000, 'Adidasss', 'k03'); insert into Termek values('t11', 'Fű', 5000, 'KO', 'k04'); insert into Termek values('t12', 'AB2 puska', 5000, 'Mert megérdemled', 'k04'); insert into Termek values('t13', 'Benzin', 350, 'Óccsó', 'k04'); insert into Termek values('t14', 'Nő', 10000, 'Szőke', 'k04'); insert into Termek values('t15', 'Nő', 20000, 'Barna', 'k04'); insert into Termek values('t16', 'Óvszer', 2000, 'Családi csomag', 'k04'); 66/75
Órai feladatok 2. Vigye fel az alábbi rekordokat: insert into Vasarlas values(1, '15-FEBR. -16', 't14', 1, 'v06'); insert into Vasarlas values(2, '15-FEBR. -16', 't15', 1, 'v06'); insert into Vasarlas values(3, '15-FEBR. -16', 't16', 1, 'v06'); insert into Vasarlas values(4, '15-FEBR. -16', 't03', 4, 'v01'); insert into Vasarlas values(5, '15-FEBR. -16', 't04', 1, 'v01'); insert into Vasarlas values(6, '15-FEBR. -16', 't02', 2, 'v02'); insert into Vasarlas values(7, '15-FEBR. -16', 't06', 2, 'v02'); insert into Vasarlas values(8, '15-FEBR. -16', 't07', 4, 'v02'); insert into Vasarlas values(9, '15-FEBR. -16', 't08', 1, 'v03'); insert into Vasarlas values(10, '15-FEBR. -16', 't09', 1, 'v03'); insert into Vasarlas values(11, '15-FEBR. -16', 't11', 3, 'v04'); insert into Vasarlas values(12, '15-FEBR. -16', 't12', 1, 'v04'); insert into Vasarlas values(13, '15-FEBR. -16', 't13', 100, 'v05'); insert into Vasarlas values(1, '15-FEBR. -17', 't12', 1, 'v11'); insert into Vasarlas values(2, '15-FEBR. -17', 't16', 5, 'v10'); insert into Vasarlas values(3, '15-FEBR. -17', 't16', 1, 'v09'); insert into Vasarlas values(4, '15-FEBR. -17', 't03', 6, 'v07'); 67/75
Órai feladatok 3. 1. Készítsen egy UjKategoria nevű tárolt eljárást, mely paraméterként megkapja egy új kategória adatait, és beszúrja a Kategoria táblába. Próbálja ki az eljárást. 2. Készítsen egy KategoriaTorol nevű tárolt eljárást, mely kitöröl egy adott kódú kategóriát. Próbálja ki az eljárást. H 29 3. Készítsen KategoriaDarab nevű tárolt függvényt, mely visszaadja a kategóriák darabszámát. Hívja meg a függvényt. H 36 68/75
Órai feladatok 4. Készítsen egy UjTermek2 nevű tárolt eljárást, mely paraméterként megkapja egy új termék adatait, és beszúrja a termek táblába. Ha már létező kategóriakódot kap paraméterként, írjon üzenetet a képernyőre (Van már ilyen kategória: kkod), és ne hozza létre a kategóriát. H 40 69/75
Órai feladatok 5. Készítsen egy VasarloTorol nevű eljárást,, mely paraméterként megkapja egy vásárló VID-jét. Ha nem létezik a személy, akkor írjon üzenetet a képernyőre (Nem létező személy: VID). H 40 70/75
Órai feladatok 6. Készítsen egy TermekAtlag nevű függvényt, amely kiszámítja, és visszatérő értékként visszaadja a termék táblában lévő termékek átlagárát. Hívja meg a függvényt, használjon a visszatérő értékhez parancssori változót. Írja ki az eredményt a képernyőre. H 40 Hívja meg a függvényt a select paranccsal is! 71/75
Órai feladatok 7. Készítsen egy TermKatAtlag nevű függvényt, amely kiszámítja, és visszatérő értékként visszaadja a termék táblában lévő, adott kategóriájú termékek átlagárát. A függvény bemenő paramétere legyen a kategória neve (nem a kódja!) Ha nem létezik a megadott kategória, írja ki ennek tényét a függvény a képernyőre (Nem létező kategória: KatBe), és adjon vissza 0 értéket! H 40 Hívja meg a függvényt! 72/75
Órai feladatok 8. 1. Készítsen egy OsszParos nevű tárolt eljárást, mely paraméterként megkap egy kezdő és egy végértéket (egész számok), és kiszámítja a két végérték közötti páros számok összegét. H 45 Segítség: - A bemenő paraméterek értékét nem lehet felülírni! - IF MOD(szám, 2) = 0 THEN ha a szám kettővel osztva nullát ad maradékul akkor 73/75
Felhasznált irodalom Kovács László: PL/SQL, elektronikus jegyzet Barabás Péter: Adatbázis rendszerek 2., elektronikus jegyzet Jeffery D. Ullman, Jennifer Widom: Adatbázisrendszerek Kende Mária, Nagy István: ORACLE példatár Don Burleson: Oracle Tips (www.dba-oracle.com) 74/75
VÉGE V É G E 75/75