cr_func_arbeit.sql 9.54 KB
-- Funktionen um Arbeitsplaetze zu verwalten --
-- [
create function "chk_arbeit" (text,text,numeric(10,2),int4,int4)
    returns int4 as '
        /* 
         * chk_arbeit(position, beschreibung, gehalt, id_person, id_abteilung)
         *
         * ueberpruefen ob eine passender Stelle 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 firma.arbeit%ROWTYPE;
        BEGIN
            IF $4 IS NULL OR $4 < 1 OR
               $5 IS NULL OR $5 < 1 OR
               $1 IS NULL OR $1 = '''' THEN
                RETURN -1;
            END IF;

            select INTO ida * from firma.arbeit where
                id_person = $4 and id_abteilung = $5;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                IF ida.position <> $1 OR ida.beschreibung <> $2 OR
                   ida.gehalt <> $3 THEN
                    RETURN -2;
                END IF;
            END IF;                

            RETURN 1;
        END;
    ' language 'plpgsql';

create function "ins_arbeit" (text,text,numeric(10,2),int4,int4)
    returns int4 as '
        /* 
         * ins_arbeit(position, beschreibung, gehalt, id_person, id_abteilung)
         *
         * fügt eine Stelle 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
            chk int4;
        BEGIN
            select INTO chk firma.chk_arbeit($1, $2, $3, $4, $5);

            IF chk = 0 THEN
                insert into firma.arbeit (position, beschreibung, gehalt,
                                          id_person, id_abteilung)
                    values ($1, $2, $3, $4, $5);

                RETURN 1;
            END IF;

            RETURN 0;
        END;
    ' language 'plpgsql';

create function "chk_firma" (text, text, varchar(10))
    returns int4 as '
        /* 
         * chk_firma(name, beschreibung, plz_f)
         *
         * ueberpruefen ob die Firma schon in der DB gespeichert ist.
         *
         * returns: -1: falsche Parameter
         *          -2: Inkonsistenz endeckt. Es existiert bereits ein
         *              Land mit dem einer, aber nicht alle der Parameter 
         *              übereinstimmen
         *          0: Land existiert noch nicht in der DB
         *          >0: Land existiert bereits, gibt id_land zurück.
         */

        DECLARE
            idf firma.firma%ROWTYPE;
        BEGIN
            IF $1 IS NULL OR $1 = '''' THEN
                return -1;
            END IF;

            IF $3 IS NOT NULL THEN
                select INTO idf * from firma.firma where
                    name = $1 and plz_f = $3;
            ELSE
                select INTO idf * from firma.firma where
                    name = $1;
            END IF;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                IF idf.beschreibung <> $2 THEN
                    RETURN -2;
                END IF;
            END IF;

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

create function "ins_firma" (text, text, varchar(10), int4)
    returns int4 as '
        /* 
         * ins_firma(name, beschreibung, plz_f, id_adresse)
         *
         * fügt eine Firma in die DB ein sofern es nicht schon existiert,
         * inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
         * sind.
         * Ausserdem wir die globale Abteilung zu der Firma angelegt, siehe
         * cr_tables.sql
         *
         * returns: 0: wenn die Firma nicht eingefuegt werden kann
         *          >0: wenn die Firma eingefuegt werden konnte oder bereits
         *              existierte, gibt id_firma zurück.
         */

        DECLARE
            idf firma.firma._id_%TYPE;
        BEGIN
            select INTO idf firma.chk_firma($1, $2, $3);

            IF idf < 0 THEN
                RETURN 0;
            ELSE
                IF idf = 0 THEN
                    insert into firma.firma (name, beschreibung, plz_f)
                        values ($1, $2, $3);

                    select INTO idf firma.chk_firma($1, $2, $3);

                    PERFORM firma.ins_abteilung(''_FIRMA_'', $2, idf, $4);
                END IF;
            END IF;

            RETURN idf;
        END;
    ' language 'plpgsql';

create function "id_abteilung" (text, int4)
    returns int4 as '
        /*
         * id_abteilung(bezeichnung, id_firma);
         * gibt die id_abteilung einer bestimmten Abteilung einer
         * bestimmten Firma aus.
         *
         * returns: 0: wenn keine passnede Abteilung existiert
         *          >0: die Abteilung (id_abteilung)
         */

        DECLARE
            ida firma.abteilung._id_%TYPE;
        BEGIN
            select INTO ida _id_ from firma.abteilung where 
                id_firma = $2 and bezeichnung = $1;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN ida;
            END IF;
        END;
    ' language 'plpgsql';

create function "id_firma" (text,varchar(10))
    returns int4 as '
        /*
         * id_firma(name, plz_f);
         * gibt die id_abteilung der zentralen Abteilung einer Firma aus
         * siehe dazu auch cr_tables.sql
         *
         * returns: 0: wenn keine passende Firma existiert
         *          >0: die Firma (id_firma)
         */

        DECLARE
            idf firma.firma._id_%TYPE;
        BEGIN
            IF $2 IS NOT NULL THEN
                select INTO idf _id_ from firma.firma where 
                    name = $1 and plz_f = $2;
            ELSE
                select INTO idf _id_ from firma.firma where 
                    name = $1;
            END IF;

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN idf;
            END IF;
        END;
    ' language 'plpgsql';

create function "id_abteilung_firma" (int4)
    returns int4 as '
        /*
         * id_abteilung_firma(id_firma);
         * gibt die id_abteilung der zentralen Abteilung einer Firma aus
         * siehe dazu auch cr_tables.sql
         *
         * returns: 0: wenn keine Firma zu dieser id_firma existiert
         *          >0: die Abteilung zu der Firma (id_abteilung)
         */

        DECLARE
            ida firma.abteilung._id_%TYPE;
        BEGIN
            select INTO ida _id_ from firma.abteilung where 
                id_firma = $1 and bezeichnung = ''_FIRMA_'';

            IF NOT FOUND THEN
                RETURN 0;
            ELSE
                RETURN ida;
            END IF;
        END;
    ' language 'plpgsql';

create function "chk_abteilung" (text, text, int4, int4)
    returns int4 as '
        /* 
         * chk_abteilung(bezeichnung, beschreibung, id_firma, id_adresse)
         *
         * ueberpruefen ob die Abteilung schon in der DB gespeichert ist.
         *
         * returns: -1: falsche Parameter
         *          -2: Inkonsistenz endeckt. Es existiert bereits ein
         *              Land mit dem einer, aber nicht alle der Parameter 
         *              übereinstimmen
         *          0: Land existiert noch nicht in der DB
         *          >0: Land existiert bereits, gibt id_land zurück.
         */

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

            select INTO ida * from firma.abteilung where
                bezeichnung = $1 and id_firma = $3;

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

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

create function "ins_abteilung" (text, text, int4, int4)
    returns int4 as '
        /* 
         * ins_abteilung(bezeichnung, beschreibung, id_firma, id_adresse)
         *
         * fügt eine Abteilung in die DB ein sofern es nicht schon existiert,
         * inkonsistenzen erzeugt wuerden, oder die Eingabedaten fehlerhast
         * sind.
         *
         * returns: 0: wenn die Abteilung nicht eingefuegt werden kann
         *          >0: wenn die Abteilung eingefuegt werden konnte oder bereits
         *              existierte, gibt id_firma zurück.
         */

        DECLARE
            ida firma.abteilung._id_%TYPE;
        BEGIN
            select INTO ida firma.chk_abteilung($1, $2, $3, $4);

            IF ida = -1 THEN
                RETURN 0;
            ELSE
                IF ida = 0 THEN
                    insert into firma.abteilung (bezeichnung, beschreibung,
                                                 id_firma, id_adresse)
                        values ($1, $2, $3, $4);

                    select INTO ida firma.chk_abteilung($1, $2, $3, $4);
                END IF;
            END IF;

            RETURN ida;
        END;
    ' language 'plpgsql';
-- ]
-- Ende Arbeitsplatz --