Some SQL targeted at PostgreSQL. This was intended as the database backend for user management in an online shop system.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

308 lines
9.5 KiB

-- 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 --