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.
 
 
 

101 lines
3.0 KiB

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