Funktionsaufruf, mit integrierter Sequenz

Hallo, ich hab da ein kleines Problem, ich will eine Funktion schreiben, die automatisch eine Sequenz ruft und somit den Primärschlüssel automatisch setzt. Leider hab ich keine Infos gefunden, ob dies überhaupt möglich ist, aus einer Funktion im Statement eine Sequenz auszuführen. Kann mir jemand sagen, wie das geht bzw. ob das überhaupt möglich ist. Mein Ansatz schaut bisher so aus, funktioniert aber leider net:

– Sequenz erzeugen:

CREATE SEQUENCE serial START 1000;

– Funktion anlegen:

CREATE OR REPLACE FUNCTION f_insert(VARCHAR(30), int4, float4, VARCHAR(2))
RETURNS void AS
'INSERT INTO artikel VALUES(SELECT nextval('serial'), $1, $2, $3, $4)
LANGUAGE sql;

Also die Aussage “funktioniert leider nicht” ist natürlich sehr hilfreich …

Ansonsten: zuerst einmal gib beim Insert alle Spaltennamen mit an, also sollte das so aussehen:

INSERT INTO table (spalte1, spalte2, spalte3) VALUES ('value1', 'value2', 'value3')

Das macht spätere Erweiterungen einfacher, weil du nicht jedes Stück Code überarbeiten und testen musst.

Nun zu deinem eigentlichen Problem:

http://www.postgresql.org/docs/8.1/static/functions-sequence.html ist da schon fast eindeutig, du gibst als Wert einfach nur:

nextval('sequence_name')

an. Reicht. Das Select, was du noch im Insert mit drin hast, dürfte höchstwahrscheinlich einen Syntax Fehler erzeugen …

Danke für die rasche Antwort, ich hab deine Ratschläge beherzigt. Aber an dem Select vor dem Aufruf der Sequenz lag es leider nicht, aber ich hab gerade in der Hilfe die Lösung mir noch “erarbeitet”, falls es wen interessiert, in der Funktion muss die Sequenz nach diesem Schema gerufen werden:

nextval(''sequenzname''::text)

Hallo logo,

warum verwendest Du in der Tabelle nicht folgende Definition

id	SERIAL		Primary Key

Damit wird bei jedem INSERT id automatisch einen Wert zugewiesen. Um den Wert von id muss Du dich daher nicht kümmern.



mfg

fristo