SET SERVEROUTPUT ON
/* 1. példa */
DECLARE
rossz_ugyf_azon EXCEPTION;
PROCEDURE ellenoriz_ugyf_azon (id ugyfel.azon%TYPE) IS
ell NUMBER(1);
BEGIN
SELECT COUNT(1)
INTO ell
FROM ugyfel
WHERE azon = id;
IF ell = 0 THEN RAISE rossz_ugyf_azon;
END IF;
END ellenoriz_ugyf_azon;
FUNCTION kiir_ugyf_penz (id ugyfel.azon%TYPE) RETURN NUMBER IS
ossz NUMBER;
BEGIN
ellenoriz_ugyf_azon(id);
SELECT SUM(osszeg)
INTO ossz
FROM szamla
WHERE ugyf_azon = id
GROUP BY ugyf_azon;
RETURN ossz;
END kiir_ugyf_penz;
BEGIN
DBMS_OUTPUT.PUT_LINE('Azon: U01, Osszeg: ' || kiir_ugyf_penz('U01'));
DBMS_OUTPUT.PUT_LINE('Azon: U56, Osszeg: ' || kiir_ugyf_penz('U56'));
EXCEPTION
WHEN rossz_ugyf_azon THEN
DBMS_OUTPUT.PUT_LINE('Nem jo az ugyfel azonosito!');
END;
/* 2. példa */
CREATE OR REPLACE PROCEDURE aut_osszesito (dat DATE) IS
BEGIN
FOR sor IN (SELECT aut_azon, SUM(ABS(osszeg)) osszes, COUNT(azon) db
FROM tranzakcio
WHERE datum = dat
GROUP BY aut_azon)
LOOP
DBMS_OUTPUT.PUT_LINE('Automata : ' || sor.aut_azon || ', penzmozgas: ' || sor.osszes || ', tranzakciok szama: ' || sor.db);
END LOOP;
END aut_osszesito;
/
show errors
/* 3. példa */
CREATE OR REPLACE PACKAGE bank_kezelo IS
rossz_ugyf_azon EXCEPTION;
rossz_szamla_azon EXCEPTION;
rossz_aut_azon EXCEPTION;
rossz_reszl_azon EXCEPTION;
rossz_tranz_azon EXCEPTION;
tul_sok_penz EXCEPTION;
PROCEDURE azon_ellenor(id VARCHAR2, tabla_tipus CHAR);
PROCEDURE ugyfel_torol(id ugyfel.azon%TYPE);
PROCEDURE tranzakcio_beszur (ugyf_id ugyfel.azon%TYPE, aut_id automata.azon%TYPE,
tranz_id tranzakcio.azon%TYPE, szamla_id szamla.azon%TYPE, ossz NUMBER);
PROCEDURE uj_ugyfel (ugyf_id ugyfel.azon%TYPE, ugyf_name ugyfel.nev%TYPE, birth ugyfel.szuletes%TYPE,
reszl_id reszleg.azon%TYPE, szamla_id szamla.azon%TYPE, ossz NUMBER);
PROCEDURE uj_ugyfel (ugyf_id ugyfel.azon%TYPE, ugyf_name ugyfel.nev%TYPE, birth ugyfel.szuletes%TYPE);
END bank_kezelo;
/
show errors
CREATE OR REPLACE PACKAGE BODY bank_kezelo IS
PROCEDURE azon_ellenor (id VARCHAR2, tabla_tipus CHAR) IS
rossz_parameter EXCEPTION;
ell NUMBER(1);
BEGIN
CASE LOWER(tabla_tipus)
WHEN 'u' THEN
SELECT COUNT(1)
INTO ell
FROM ugyfel
WHERE azon = id;
IF ell = 0 THEN RAISE rossz_ugyf_azon;
END IF;
WHEN 's' THEN
SELECT COUNT(1)
INTO ell
FROM szamla
WHERE azon = id;
IF ell = 0 THEN RAISE rossz_szamla_azon;
END IF;
WHEN 'a' THEN
SELECT COUNT(1)
INTO ell
FROM automata
WHERE azon = id;
IF ell = 0 THEN RAISE rossz_aut_azon;
END IF;
WHEN 'r' THEN
SELECT COUNT(1)
INTO ell
FROM reszleg
WHERE azon = id;
IF ell = 0 THEN RAISE rossz_reszl_azon;
END IF;
WHEN 't' THEN
SELECT COUNT(1)
INTO ell
FROM tranzakcio
WHERE azon = id;
IF ell = 0 THEN RAISE rossz_tranz_azon;
END IF;
ELSE RAISE rossz_parameter;
END CASE;
EXCEPTION
WHEN rossz_ugyf_azon THEN DBMS_OUTPUT.PUT_LINE('Hibas ugyfel azonosito!');
WHEN rossz_szamla_azon THEN DBMS_OUTPUT.PUT_LINE('Hibas szamla azonosito!');
WHEN rossz_aut_azon THEN DBMS_OUTPUT.PUT_LINE('Hibas automata azonosito!');
WHEN rossz_reszl_azon THEN DBMS_OUTPUT.PUT_LINE('Hibas reszleg azonosito!');
WHEN rossz_tranz_azon THEN DBMS_OUTPUT.PUT_LINE('Hibas tranzakcio azonosito!');
WHEN rossz_parameter THEN DBMS_OUTPUT.PUT_LINE('Hibas masodik parameter');
END azon_ellenor;
PROCEDURE ugyfel_torol(id ugyfel.azon%TYPE) IS
BEGIN
azon_ellenor(id, 'u');
DELETE FROM tranzakcio WHERE id = ugyf_azon;
DELETE FROM szamla WHERE id = ugyf_azon;
DELETE FROM ugyfel WHERE id = azon;
END ugyfel_torol;
PROCEDURE tranzakcio_beszur (ugyf_id ugyfel.azon%TYPE, aut_id automata.azon%TYPE,
tranz_id tranzakcio.azon%TYPE, szamla_id szamla.azon%TYPE, ossz NUMBER) IS
seged NUMBER;
BEGIN
azon_ellenor(ugyf_id, 'u');
azon_ellenor(aut_id, 'a');
azon_ellenor(tranz_id, 't');
azon_ellenor(szamla_id, 's');
SELECT COUNT(1)
INTO seged
FROM szamla sz, ugyfel u
WHERE szamla_id = sz.azon AND (ossz > osszeg OR ugyf_id = u.azon AND ossz > keret);
IF seged > 0 THEN RAISE tul_sok_penz;
END IF;
INSERT INTO tranzakcio VALUES
(tranz_id, aut_id, szamla_id, ugyf_id, SYSDATE, ossz*-1);
UPDATE automata
SET penz = penz-ossz
WHERE azon = aut_id;
UPDATE szamla
SET osszeg = osszeg-ossz
WHERE azon = szamla_id;
EXCEPTION
WHEN tul_sok_penz THEN DBMS_OUTPUT.PUT_LINE('Nem lehet ennyi penzt levenni!');
END tranzakcio_beszur;
PROCEDURE uj_ugyfel (ugyf_id ugyfel.azon%TYPE, ugyf_name ugyfel.nev%TYPE, birth ugyfel.szuletes%TYPE,
reszl_id reszleg.azon%TYPE, szamla_id szamla.azon%TYPE, ossz NUMBER) IS
BEGIN
INSERT INTO ugyfel VALUES
(ugyf_id, ugyf_name, birth, ossz*0.75);
INSERT INTO szamla VALUES
(szamla_id, ugyf_id, reszl_id, ossz, SYSDATE + 5*365); -- Azaz 5 év múlva jár majd le a számla.
END uj_ugyfel;
PROCEDURE uj_ugyfel (ugyf_id ugyfel.azon%TYPE, ugyf_name ugyfel.nev%TYPE, birth ugyfel.szuletes%TYPE) IS
BEGIN
INSERT INTO ugyfel VALUES
(ugyf_id, ugyf_name, birth, 0);
END uj_ugyfel;
BEGIN
NULL;
END;
/
show errors