Ich habe eine Funktion wie diese:
CREATE OR REPLACE FUNCTION f1(my_name varchar)
RETURNS integer AS
$BODY$
DECLARE
my_record record;
BEGIN
SELECT * INTO my_record FROM t1 where name = my_name;
IF NOT FOUND THEN
INSERT INTO t1(
name)
VALUES (my_name) RETURNING * INTO my_record;
END IF;
return my_record.id;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Wenn also kein Eintrag mit dem Namen in der Tabelle vorhanden ist, dann wird einer eingefügt und die ID von der Sequence zurückgegeben. Wenn einer vorhanden ist, dann wird diese ID zurückgegeben.
Leider wird immer beim Aufruf dieser Funktion die Sequence erhöht (auch wenn kein Insert ausgeführt wird), und ich habe deswegen schon einen Wertbereichüberlauf.
Dann hab ich die “vorzeitige Auswertung” der Inserts versucht mit EXECUTES zu unterdrücken:
CREATE OR REPLACE FUNCTION f1(my_name varchar)
RETURNS integer AS
$BODY$
DECLARE
my_record record;
BEGIN
SELECT * INTO my_record FROM t1 where name = my_name;
IF NOT FOUND THEN
EXECUTE 'INSERT INTO t1(
name)
VALUES (' || quote_literal(my_name) || ') RETURNING *' INTO my_record;
END IF;
return my_record.id;
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
Hat auch nicht funktioniert. Ich bin echt sprachlos, da ich damit nicht gerechnet habe.
Hat jemand eine Idee wie ich das in den Griff bekommen kann?