cr_func_ort.sql 2.99 KB
-- Funktionen um Orte zu verwalten --
-- [
create function "chk_ort" (text,varchar(10),int4)
    returns int4 as '
        /* 
         * chk_ort(ort, vorwahl_o, id_land)
         *
         * ueberpruefen ob der Ort schon in der DB gespeichert ist.
         *
         * returns: -1: falsche Parameter
         *          -2: Inkonsistenz endeckt. Es existiert bereits ein
         *              Ort mit dem einer, aber nicht alle der Parameter 
         *              übereinstimmen
         *          0: Ort existiert noch nicht in der DB
         *          >0: Ort existiert bereits, gibt id_ort zurück.
         */

        DECLARE
            ido adresse.ort%ROWTYPE;
        BEGIN
            IF $2 IS NULL OR $2 = '''' OR
               $3 IS NULL OR $3 < 1 THEN
                RETURN -1;
            END IF;

            --
            -- OK, also zu jeder Kombination (vorwahl_o und id_land) kann
            -- es nur einen Ort geben.
            --
            select INTO ido * from adresse.ort where
                vorwahl_o = $2 and
                id_land = $3;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                IF ido.ort <> $1 THEN
                    RETURN -1;
                END IF;
            END IF;

            RETURN ido._id_;
        END;
    ' language 'plpgsql';

create function "ins_ort" (text,varchar(10),int4) 
    returns int4 as '
        /* 
         * ins_land(ort, vorwahl_o, id_land)
         *
         * fügt einen Ort in die DB ein sofern es nicht schon existiert,
         * Inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
         * sind.
         *
         * returns: 0: wenn der Ort nicht eingefuegt werden kann
         *          >0: wenn der Ort eingefuegt werden konnte oder bereits
         *              existierte, gibt id_ort zurück.
         */

        DECLARE
            id_ort adresse.ort._id_%TYPE;
        BEGIN
            select INTO id_ort adresse.chk_ort($1, $2, $3);

            IF id_ort = -1 THEN
                RETURN 0;
            ELSE
                IF id_ort = 0 THEN
                    insert into adresse.ort (ort, vorwahl_o, id_land)
                        values ($1, $2, $3);

                    select INTO id_ort adresse.chk_ort($1, $2, $3);
                END IF;
            END IF;

            RETURN id_ort;
        END;
    ' language 'plpgsql';

create function "id_ort" (varchar(10),int4)
    returns int4 as '
        /* 
         * get_id_ort_by_ukey1(vorwahl_o, id_land)
         *
         * Ermittelt die id (id_ort) eines in der DB enthaltenen Orts 
         * anhand des Primaerschluessels (vorwahl_o, id_land) 
         *
         * returns: 0: wenn das Land nicht eingefuegt werden kann
         *          >0: wenn das Land gefunden wurde, gibt id_land zurück.
         */

        DECLARE
            ido adresse.ort._id_%TYPE;
        BEGIN
            select INTO ido adresse.chk_ort(NULL, $1, $2);

            RETURN ido;
        END;
    ' language 'plpgsql';
-- ]
-- Ende Orte --