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