cr_func_adresse.sql 3.35 KB
-- Funktionen um Adressen zu verwalten --
-- [
create function "chk_adresse" (text,varchar(5),varchar(10),int4,int4)
    returns int4 as '
        /* 
         * chk_adresse(strasse, h_nr, plz_a, id_ort, id_land)
         *
         * ueberpruefen ob die Adresse schon in der DB gespeichert ist.
         *
         * returns: -1: falsche Parameter
         *          -2: Inkonsistenz endeckt. Es existiert bereits eine
         *              Adresse mit dem einer, aber nicht alle der Parameter 
         *              übereinstimmen
         *          0: Adresse existiert noch nicht in der DB
         *          >0: Adresse existiert bereits, gibt id_adresse zurück.
         */

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

            select INTO ida * from adresse.adresse where
                strasse = $1 and plz_a = $3 and
                id_land = $5;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                IF ida.h_nr <> $2 OR ida.id_ort <> $4 THEN
                    RETURN -2;
                END IF;
            END IF;

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

create function "ins_adresse" (text,varchar(5),varchar(10),int4,int4) 
    returns int4 as '
        /* 
         * ins_adresse(strasse, h_nr, plz_a, id_ort, id_land)
         *
         * fügt eine Adresse in die DB ein sofern es nicht schon existiert,
         * inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
         * sind.
         *
         * returns: 0: wenn die Adresse nicht eingefuegt werden kann
         *          >0: wenn die Adresse eingefuegt werden konnte oder bereits
         *              existierte, gibt id_adresse zurück.
         */

        DECLARE
            id_adresse adresse.adresse._id_%TYPE;
        BEGIN
            select INTO id_adresse adresse.chk_adresse($1, $2, $3, $4, $5);

            IF id_adresse = -1 THEN
                RETURN 0;
            ELSE
                IF id_adresse = 0 THEN
                    insert into adresse.adresse (strasse,h_nr,plz_a,
                                                 id_ort,id_land)
                        values ($1, $2, $3, $4, $5);

                    select INTO id_adresse adresse.chk_adresse($1,$2,$3,$4,$5);
                END IF;
            END IF;

            RETURN id_adresse;
        END;
    ' language 'plpgsql';

create function "id_adresse" (text,varchar(5),varchar(10),int4)
    returns int4 as '
        /* 
         * id_adresse(strasse, h_nr, plz_a, id_land)
         *
         * Ermittelt die id (id_adresse) einer in der DB enthaltenen Adresse 
         * 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
        ida adresse.adresse._id_%TYPE;
    BEGIN
            select INTO ida _id_ from adresse.adresse where
                strasse = $1 and h_nr = $2 and plz_a = $3 and id_land = $4;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN ida;
            END IF;
    END;
    ' language 'plpgsql';
-- ]
-- Ende Adressen --