CREATE OR REPLACE FUNCTION dem.add_person(_lastname text, _firstname text, _gender text) -- you may prefer to change the arguments to add day of birth instead of gender RETURNS integer AS -- returns dem.identity.pk of newly created person $BODY$ DECLARE _id integer; BEGIN -- name already there ? select into _id id from dem.names where firstnames = _firstname and lastnames = _lastname; if FOUND then RAISE EXCEPTION 'This name already exist.' USING HINT = 'Name ID: ' || _id::text ; end if; -- no, insert new identity and name INSERT INTO dem.identity (gender) VALUES(_gender); INSERT INTO dem.names (id_identity, firstnames, lastnames) VALUES (currval('dem.identity_pk_seq'), _firstname, _lastname); if FOUND then return currval('dem.names_id_seq'); end if; return NULL; END;$BODY$ LANGUAGE plpgsql VOLATILE COST 100; ALTER FUNCTION dem.add_person(text, text, text) OWNER TO "gm-dbo";