cr_func_person.sql 9.49 KB
-- Funktionen um Personen zu verwalten --
-- [
create function "chk_person" (varchar(10),text,text,text,text,
                              varchar(10),varchar(10),varchar(10),varchar(50),
                              varchar(50), varchar(100))
    returns int4 as '
        /* 
         * chk_person(anrede, titel, nachname, vorname, geb_dat,
         *            postfach, telefon, fax, handy,
         *            email, webpage)
         *
         * ueberpruefen ob die Person schon in der DB gespeichert ist.
         *
         * returns: -1: falsche Parameter
         *          -2: Inkonsistenz endeckt. Es existiert bereits eine
         *              Person mit dem einer, aber nicht alle der Parameter 
         *              übereinstimmen
         *          0: Person existiert noch nicht in der DB
         *          >0: Person existiert bereits, gibt id_person zurück.
         */

        DECLARE
            idp person.person%ROWTYPE;
        BEGIN
            IF $3 IS NULL OR $3 = '''' OR
               $4 IS NULL OR $4 = '''' OR
               $5 IS NULL OR $5 = '''' THEN
                RETURN -1;
            END IF;

            select INTO idp * from person.person where
                nachname = $3 and vorname = $4 and
                geb_dat = $5::date;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                IF idp.anrede <> $1 OR idp.titel <> $2 OR
                   idp.postfach <> $6 OR idp.telefon <> $7 OR
                   idp.fax <> $8 OR idp.handy <> $9 OR
                   idp.email <> $10 OR idp.webpage <> $11 THEN
                    RETURN -2;
                END IF;
            END IF;

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

create function "ins_person" (varchar(10),text,text,text,text,
                              varchar(10),varchar(10),varchar(10),varchar(50),
                              varchar(50),varchar(100))
    returns int4 as '
        /* 
         * ins_person(anrede, titel, nachname, vorname, geb_dat,
         *            postfach, telefon, fax, handy,
         *            email, webpage)
         *
         * fügt eine Person in die DB ein sofern es nicht schon existiert,
         * inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
         * sind.
         *
         * returns: 0: wenn die Person nicht eingefuegt werden kann
         *          >0: wenn die Person eingefuegt werden konnte oder bereits
         *              existierte, gibt id_person zurück.
         */

        DECLARE
            idp person.person._id_%TYPE;
        BEGIN
            select INTO idp person.chk_person($1,$2,$3,$4,$5,$6,$7,$8,$9,
                                              $10,$11);

            IF idp < 0 THEN
                RETURN 0;
            ELSE
                IF idp = 0 THEN
                    insert into person.person (anrede,titel,nachname,vorname,
                                               geb_dat,postfach,telefon,fax,
                                               handy,email,webpage)
                        values ($1,$2,$3,$4,$5::date,$6,$7,$8,$9,$10,$11);

                    select INTO idp person.chk_person($1,$2,$3,$4,$5,$6,
                                                      $7,$8,$9,$10,$11);
                END IF;
            END IF;

            RETURN idp;
        END;
    ' language 'plpgsql';
    
create function "ins_person" (varchar(10),text,text,text,text,
                              varchar(10),varchar(10),varchar(10),varchar(50),
                              varchar(50),varchar(100),int4)
    returns int4 as '
        /* 
         * ins_person(anrede, titel, nachname, vorname, geb_dat,
         *            postfach, telefon, fax, handy,
         *            email, webpage, id_adresse, id_abteilung)
         *
         * fügt eine Person in die DB ein sofern es nicht schon existiert,
         * inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
         * sind.
         * Außerdem werden schon zuordnugen zu einer Adresse und einem Arbeits
         * platz gemacht.
         *
         * returns: 0: wenn die Person nicht eingefuegt werden kann
         *          >0: wenn die Person eingefuegt werden konnte oder bereits
         *              existierte, gibt id_person zurück.
         */

        DECLARE
            idp person.person._id_%TYPE;
        BEGIN
            select INTO idp person.ins_person($1,$2,$3,$4,$5,$6,$7,$8,$9,
                                              $10,$11);

            IF idp = 0 THEN
                RETURN 0;
            ELSE
                PERFORM person.person_adresse(idp, $12);
                /* 
                 * Die Zuordnung zu arbeit erfordert weiter Informationen,
                 * wie Gehalt, Position u.a. darum ist eine Zuordnung hier
                 * warscheinlich nicht seht sinnvoll. Trotzdem lasse ich das
                 * hier nochmal auskommentiert stehen, vielleicht braucht man
                 * es ja doch...
                 */
                --select INTO tmp create_rel_person_abteilung(idp, $13);--
            END IF;

            RETURN idp;
        END;
    ' language 'plpgsql';

create function "person_adresse" (int4, int4)
    returns int4 as '
        /*
         * person_adresse(id_person, id_adresse)
         *
         * ordnet eine Person einer Adresse zu, dies passiert ueber einen
         * Eintrag in der Relation wohnt. Es wird sichergestellt das keine
         * inkonstistenzen auftreten (keine doppelten Zuordnungen)
         *
         * returns: -1: Wenn die Eingabedaten fehlerhaft waren.
         *          0: Wenn die Zuordnung nicht gemacht werden konnte.
         *          1: Wenn die Zuordnung gemacht wurde.
         */

        BEGIN
            IF $1 IS NULL OR $1 < 1 OR
               $2 IS NULL OR $2 < 1 THEN
                RETURN -1;
            END IF;

            PERFORM * from person.person where _id_ = $1;
            IF NOT FOUND THEN
                RETURN 0;
            END IF;

            PERFORM * from adresse.adresse where _id_ = $2;
            IF NOT FOUND THEN
                RETURN 0;
            END IF;

            PERFORM * from person.wohnt where 
                id_person = $1 and id_adresse = $2;
            IF NOT FOUND THEN
                insert into person.wohnt (id_person, id_adresse) 
                    values ($1, $2);
                IF NOT FOUND THEN
                    RETURN 0;
                END IF;
            END IF;

            RETURN 1;
        END;
    ' language 'plpgsql';

-- Da kann ich keinen view draus machen, da ich einen Parameter brauche.
create function "person_wohnt" (int4)
    returns SETOF wohnt as '
        /*
         * person_wohnt(id_person)
         *
         * ordnet eine Person einer Adresse zu, dies passiert ueber einen
         * Eintrag in der Relation wohnt. Es wird sichergestellt das keine
         * inkonstistenzen auftreten (keine doppelten Zuordnungen)
         * Wird fuer id_adresse NULL oder ein Wert < 1 eingegeben, so sucht
         * die Funktion nach den Ein
         *
         * Das ist im prinziep das selbe wie 
         * select * from wohnt where id_person=??
         * ich lass es trotzdem zu anschauungszwecken drin.
         *
         * returns: -1 (in erstem Element): Wenn die Eingabedaten fehlerhaft 
         *                                  waren.
         *          0 (im ersten Element): Die Person existiert nicht
         *          >0 (in allen Elementen): Jede Adresse (id_adresse) an der 
         *                                   die Person wohnt.
         *          <EMPTY SET>: Keine Adresse gefunden.
         */

        DECLARE
            idw_curs refcursor;
            idw person.wohnt%ROWTYPE;
        BEGIN
            IF $1 IS NULL OR $1 < 1 THEN
                idw.id_person := -1;
                idw.id_adresse := -1;
                RETURN NEXT idw;
                RETURN;
            END IF;

            PERFORM * from person.person where id_person = $1;
            IF NOT FOUND THEN
                idw.id_person := 0;
                idw.id_adresse := 0;
                RETURN NEXT idw;
                RETURN;
            END IF;

            /* 
             * Moeglichkeit 1
             *
             * OPEN idw_curs FOR select * from person.wohnt where id_person = $1;
             *
             * FETCH idw_curs INTO idw;
             * WHILE FOUND LOOP
             *     RETURN NEXT idw;
             *     FETCH idw_curs INTO idw;
             * END LOOP; 
             */

            /* 
             * Moeglichkeit 2
             */
            FOR idw IN select * from person.wohnt where id_person = $1 LOOP
                RETURN NEXT idw;
            END LOOP;

            RETURN;
        END;
    ' language 'plpgsql';

create function "id_person" (text, text, text)
    returns int4 as '
        /* 
         * get_id_person_by_ukey1(nachname, vorname, geb_dat)
         *
         * Ermittelt die id (id_person) einer in der DB enthaltenen Person 
         * anhand des Primaerschluessels (nachname, vorname, geb_dat) 
         *
         * returns: 0: wenn die Person nicht eingefuegt werden kann
         *          >0: wenn die Person gefunden wurde, gibt id_person zurück.
         */

        DECLARE
            idp person.person._id_%TYPE;
        BEGIN
            select INTO idp _id_ from person.person where
                nachname = $1 and vorname = $2 and geb_dat = $3::date;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN idp;
            END IF;
        END;
    ' language 'plpgsql';
-- ]
-- Ende Personendaten --