2.6.1.1.
Oracle csomagok, eljárások, függvények
2.6.1.1.1. Hozzon létre PL/SQL csomagot, amely a „vevő” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
CREATE OR REPLACE PACKAGE vevo_csomag AS
PROCEDURE insert_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN
vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE);
PROCEDURE delete_vevo (ugy IN vevo.ugyfelszam%TYPE);
PROCEDURE update_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN
vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE);
END vevo_csomag;2.6.1.1.2. Hozza létre a csomagtörzset az 6.1.1/1. feladatban létrehozott csomaghoz!
CREATE OR REPLACE PACKAGE BODY vevo_csomag AS
PROCEDURE insert_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN
vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE) AS
BEGIN
INSERT INTO vevo VALUES(ugy, n, e, t, ir, va, ut, haz);
END;
PROCEDURE delete_vevo (ugy IN vevo.ugyfelszam%TYPE) AS
BEGIN
DELETE FROM vevo WHERE ugyfelszam = ugy;
END;
PROCEDURE update_vevo (ugy IN vevo.ugyfelszam%TYPE, n IN
vevo.nev%TYPE, e IN vevo.e_mail%TYPE, t IN vevo.tel%TYPE, ir IN vevo.i%TYPE, va IN vevo.v%TYPE, ut IN vevo.u%TYPE, haz IN vevo.hsz%TYPE) AS
BEGIN
UPDATE vevo SET nev = n, e_mail = e, tel = t, i = ir, v = va, u = ut, hsz = haz WHERE ugyfelszam = ugy;
END;
END vevo_csomag;2.6.1.1.3. Hozzon létre PL/SQL csomagot, amely a „szolgáltató” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
CREATE OR REPLACE PACKAGE szolgaltato_csomag AS
PROCEDURE insert_szolgaltato (ca IN
szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE);
PROCEDURE delete_szolgaltato (ca IN
szolgaltato.cegazonosito%TYPE);
PROCEDURE update_szolgaltato (ca IN
szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE);
END szolgaltato_csomag;2.6.1.1.4. Hozza létre a csomagtörzset az 6.1.1/3. feladatban létrehozott csomaghoz!
CREATE OR REPLACE PACKAGE BODY szolgaltato_csomag AS
PROCEDURE insert_szolgaltato (ca IN
szolgaltato.cegazonosito%TYPE, n IN szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE) IS
BEGIN
INSERT INTO szolgaltato VALUES(ca, n, ir, va, ut, haz);
END;
PROCEDURE delete_szolgaltato (ca IN szolgaltato.cegazonosito%TYPE) IS
BEGIN
DELETE FROM szolgaltato WHERE cegazonosito = ca;
END;
PROCEDURE update_szolgaltato (ca IN
szolgaltato.cegazonosito%TYPE, n IN
szolgaltato.nev%TYPE, ir IN szolgaltato.i%TYPE, va IN szolgaltato.v%TYPE, ut IN szolgaltato.u%TYPE, haz IN szolgaltato.hsz%TYPE) IS
BEGIN
UPDATE szolgaltato SET nev = n, i = ir, v = va, u = ut,
hsz = haz WHERE cegazonosito = ca;
END;
END szolgaltato_csomag;2.6.1.1.5. Hozzon létre PL/SQL csomagot, amely a „mobiltelefon” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
CREATE OR REPLACE PACKAGE mobiltelefon_csomag AS
PROCEDURE insert_mobiltelefon (csz IN
mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE);
PROCEDURE delete_mobiltelefon (csz IN
mobiltelefon.cikkszam%TYPE);
PROCEDURE update_mobiltelefon (csz IN
mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE);
END mobiltelefon_csomag;2.6.1.1.6. Hozza létre a csomagtörzset az 6.1.1/5. feladatban létrehozott csomaghoz!
CREATE OR REPLACE PACKAGE BODY mobiltelefon_csomag AS
PROCEDURE insert_mobiltelefon (csz IN
mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE) AS
BEGIN
INSERT INTO mobiltelefon VALUES(csz, l, a, t);
END;
PROCEDURE delete_mobiltelefon (csz IN
mobiltelefon.cikkszam%TYPE) AS
BEGIN
DELETE FROM mobiltelefon WHERE cikkszam = csz;
END;
PROCEDURE update_mobiltelefon (csz IN
mobiltelefon.cikkszam%TYPE, l IN mobiltelefon.leiras%TYPE, a IN mobiltelefon.ar%TYPE, t IN mobiltelefon.tipusa%TYPE) AS
BEGIN
UPDATE mobiltelefon SET leiras = l, ar = a, tipusa = t
WHERE cikkszam = csz;
END;
END mobiltelefon_csomag;2.6.1.1.7. Hozzon létre PL/SQL csomagot, amely a „tel” táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
CREATE OR REPLACE PACKAGE tel_csomag AS
PROCEDURE insert_tel (i IN tel.id%TYPE, tsz IN
tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE);
PROCEDURE delete_tel (i IN tel.id%TYPE);
PROCEDURE update_tel (i IN tel.id%TYPE, tsz IN
tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE);
END tel_csomag;2.6.1.1.8. Hozza létre a csomagtörzset az 6.1.1/7. feladatban létrehozott csomaghoz!
CREATE OR REPLACE PACKAGE BODY tel_csomag AS
PROCEDURE insert_tel (i IN tel.id%TYPE, tsz IN
tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE) AS
BEGIN
INSERT INTO tel VALUES(i, tsz, sz);
END;
PROCEDURE delete_tel (i IN tel.id%TYPE) AS
BEGIN
DELETE FROM tel WHERE id = i;
END;
PROCEDURE update_tel (i IN tel.id%TYPE, tsz IN
tel.telszam%TYPE, sz IN tel.szolgaltato%TYPE) AS
BEGIN
UPDATE tel SET telszam = tsz WHERE id = i;
UPDATE tel SET szolgaltato = sz WHERE id = i;
END;
END tel_csomag;2.6.1.1.9. Hozzon létre PL/SQL csomagot, amely az „elégedettség” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést, elégedettség jelleg lekérdezést valósítson meg!
CREATE OR REPLACE PACKAGE elegedettseg_csomag AS
PROCEDURE insert_elegedettseg (az IN
elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE);
PROCEDURE delete_elegedettseg (az IN
elegedettseg.azonosito%TYPE);
PROCEDURE update_elegedettseg (az IN
elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE);
FUNCTION elegedettseg_jelleg (az IN
elegedettseg.azonosito%TYPE) RETURN elegedettseg.jellege%TYPE;
END elegedettseg_csomag;2.6.1.1.10. Hozza létre a csomagtörzset az 6.1.1/9. feladatban létrehozott csomaghoz!
CREATE OR REPLACE PACKAGE BODY elegedettseg_csomag AS
PROCEDURE insert_elegedettseg (az IN
elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE) AS
BEGIN
INSERT INTO elegedettseg VALUES(az, j, v, sz);
END;
PROCEDURE delete_elegedettseg (az IN
elegedettseg.azonosito%TYPE) AS
BEGIN
DELETE FROM elegedettseg WHERE azonosito = az;
END;
PROCEDURE update_elegedettseg (az IN
elegedettseg.azonosito%TYPE, j IN elegedettseg.jellege%TYPE, v IN elegedettseg.vevo%TYPE, sz IN elegedettseg.szolgaltato%TYPE) AS
BEGIN
UPDATE elegedettseg SET jellege = j, vevo = v,
szolgaltato = sz WHERE azonosito = az;
END;
FUNCTION elegedettseg_jelleg (az IN
elegedettseg.azonosito%TYPE) RETURN elegedettseg.jellege%TYPE AS
j elegedettseg.jellege%TYPE;
BEGIN
SELECT jellege INTO j FROM elegedettseg WHERE
azonosito = az;
RETURN j;
END;
END elegedettseg_csomag;2.6.1.1.11. Hozzon létre PL/SQL csomagot, amely az „árusít” kapcsoló táblát kezeli: adatfelvitelt, adatmódosítást, adattörlést valósítson meg!
CREATE OR REPLACE PACKAGE arusit_csomag AS
PROCEDURE insert_arusit (i IN arusit.id%TYPE, d IN
arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE);
PROCEDURE delete_arusit (i IN arusit.id%TYPE);
PROCEDURE update_arusit (i IN arusit.id%TYPE, d IN
arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE);
END arusit_csomag;2.6.1.1.12. Hozza létre a csomagtörzset az 6.1.1/11. feladatban létrehozott csomaghoz!
CREATE OR REPLACE PACKAGE BODY arusit_csomag AS
PROCEDURE insert_arusit (i IN arusit.id%TYPE, d IN
arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE) AS
BEGIN
INSERT INTO arusit VALUES(i, d, sz, m);
END;
PROCEDURE delete_arusit (i IN arusit.id%TYPE) AS
BEGIN
DELETE FROM arusit WHERE id = i;
END;
PROCEDURE update_arusit (i IN arusit.id%TYPE, d IN
arusit.db%TYPE, sz IN arusit.szolgaltato%TYPE, m IN arusit.mobiltelefon%TYPE) AS
BEGIN
UPDATE arusit SET db = d, szolgaltato = sz,
mobiltelefon = m WHERE id = i;
END;
END arusit_csomag;2.6.1.1.13. Írjon tárolt eljárást, amely beszúr egy rekordot a vevő táblába a 3 kötelező mezőt kitöltve!
CREATE OR REPLACE PROCEDURE vevo_beszur(v_num NUMBER, v_nev VARCHAR,
v_mail VARCHAR) IS
BEGIN
INSERT INTO vevo (ugyfelszam, nev, e_mail) VALUES (v_num, v_nev, v_mail);
END vevo_beszur;
--Futtatása:
BEGIN
vevo_beszur(44556677, 'Valaki', '');
END;
2.6.1.1.14. Írjon tárolt eljárást, amely a vevők neveit átírja csupa nagybetűsre, majd hívja meg az eljárást!
CREATE OR REPLACE PROCEDURE vn_upperc (v1 IN vevo.nev%TYPE, v2 OUT
vevo.nev%TYPE) AS
BEGIN
v2:=UPPER(v1);
END vn_upperc;
DECLARE
CURSOR c_upperc IS SELECT * FROM vevo;
n1 vevo.nev%TYPE;
n2 vevo.nev%TYPE;
BEGIN
FOR v IN c_upperc LOOP
n1:=v.nev;
vn_upperc(n1,n2);
DBMS_OUTPUT.PUT_LINE(n1 || ', ' || n2);
END LOOP;
END;
2.6.1.1.15. Írjon tárolt eljárást, amely kilistázza és megszámolja az adatbázisban szereplő szolgáltatókat!
CREATE OR REPLACE PROCEDURE sorszam IS
CURSOR c IS SELECT nev FROM szolgaltato;
sorok_szama NUMBER;
BEGIN
FOR i IN c LOOP
sorok_szama := c%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE(i.nev);
END LOOP;
DBMS_OUTPUT.PUT_LINE('--');
IF sorok_szama > 0 THEN
DBMS_OUTPUT.PUT_LINE(sorok_szama||' szolgaltato van az adatbazisban.');
ELSE
DBMS_OUTPUT.PUT_LINE('Nincs elerheto szolgaltato.');
END IF;
END sorszam;
BEGIN
sorszam;
END;2.6.1.1.16. Írjon tárolt eljárást, amely a 25000 Ft-nál olcsóbb telefonok árát 20%-kal megnöveli!
CREATE OR REPLACE PROCEDURE ar_modosit IS
CURSOR cAr IS SELECT * FROM mobiltelefon WHERE ar < 25000 FOR
UPDATE OF ar;
BEGIN
FOR i IN cAr LOOP
UPDATE mobiltelefon SET ar = ar * 1.2 WHERE CURRENT OF cAr;
END LOOP;
END ar_modosit;
BEGIN
ar_modosit;
END;2.6.1.1.17. Írjon tárolt függvényt, amely visszaadja a legdrágább telefon árát!
CREATE OR REPLACE FUNCTION telefon_maxar RETURN NUMBER IS
t_ar mobiltelefon.ar%TYPE;
BEGIN
SELECT max(ar) INTO t_ar FROM mobiltelefon;
IF t_ar IS NOT NULL THEN
return t_ar;
ELSE
return 0;
END IF;
END;
2.6.1.1.18. Írjon függvényt, amely visszaadja a paraméterében kapott vevő nevéhez tartozó e-mail címet!
CREATE OR REPLACE FUNCTION v_email (n IN vevo.nev%TYPE) RETURN
vevo.e_mail%TYPE AS
v_em vevo.e_mail%TYPE;
BEGIN
SELECT e_mail INTO v_em FROM vevo WHERE nev = n;
IF v_em IS NOT NULL THEN
return v_em;
ELSE
return null;
END IF;
END;
2.6.1.1.19. Írjon függvényt, mely visszaadja, hogy egy paraméterül átadott azonosítójú szolgáltatóval mennyire elégedettek a vevők!
CREATE OR REPLACE FUNCTION elegedett(az IN elegedettseg.szolgaltato%TYPE) RETURN NUMBER IS
CURSOR c_j IS SELECT jellege FROM elegedettseg WHERE szolgaltato = az;
sorok_szama NUMBER;
pozitiv_j NUMBER := 0;
BEGIN
FOR i IN c_j LOOP
sorok_szama := c_j%ROWCOUNT;
IF i.jellege = 'pozitiv' THEN
pozitiv_j := pozitiv_j + 1;
END IF;
END LOOP;
RETURN (pozitiv_j/sorok_szama)*100;
END;
2.6.1.1.20. Írjon függvényt, mely visszaadja, hogy egy adott típusú mobiltelefont hány szolgálató árusít!
CREATE OR REPLACE FUNCTION tipust_arul(tip IN mobiltelefon.tipusa%TYPE) RETURN NUMBER IS
CURSOR c IS SELECT count(*) darab, szolgaltato FROM arusit,
mobiltelefon WHERE arusit.mobiltelefon = mobiltelefon.cikkszam
AND tipusa = tip GROUP BY szolgaltato;
db NUMBER := 0;
BEGIN
FOR i IN c LOOP
db := c%ROWCOUNT;
END LOOP;
RETURN db;
END;
2.6.1.1.21. Írjon függvényt, mely visszaadja, hogy a vevők hány százaléka elégedett szolgáltatójával!
CREATE OR REPLACE FUNCTION ossz_elegedett RETURN NUMBER IS
CURSOR c_e IS SELECT jellege FROM elegedettseg;
sorok_szama NUMBER;
pozitiv_e NUMBER := 0;
BEGIN
FOR i IN c_e LOOP
sorok_szama := c_e%ROWCOUNT;
IF i.jellege = 'pozitiv' THEN
pozitiv_e := pozitiv_e + 1;
END IF;
END LOOP;
RETURN (pozitiv_e/sorok_szama)*100;
END;