An deinem Beispiel stimmt vieles nicht. Oder besser gesagt:nicht viel ist rechts in deinem Beispiel.
CREATE OR REPLACE FUNCTION f_test(
name text = NULL
, city text = NULL
, phonenumber text = NULL
,address text = NULL
, OUT sno bigint)
RETURNS void AS
$func$
DECLARE
phonenumber AS VarChar(20); -- would collide with parameter name
BEGIN
phonenumber := phonenumber; -- nonsense
SELECT INTO sno max(ssno) + 1 FROM emp; -- SELECT INTO for assignment
IF sno IS NULL THEN
sno := ident_current('emp') + 1;
END IF;
RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
VALUES (name, city, phonenumber, address);
END
$func$ LANGUAGE plpgsql;
Wichtige Punkte
-
Die Fehlermeldung spricht für sich:
Das ist fast was das Handbuch dazu sagt :
-
Es würde keinen Sinn machen,
RETURNS void
zu kombinieren mitOUT
Parameter. -
Deklarieren Sie keine Variablennamen, die mit Parameternamen kollidieren. Völlig nutzlos hier.
-
Der plpgsql-Zuweisungsoperator ist
:=
, nicht=
. -
Normalerweise verwenden Sie
RAISE
nicht EbeneINFO
. Sie möchtenNOTICE
stattdessen. -
SELECT
ohne Ziel ist in plpgsql nicht möglich, Sie wollenSELECT INTO
. -
IF
wird mitEND IF
abgeschlossen nicht mitEND
.
Weiter vereinfachen
Verwenden Sie COALESCE
um Ihr IF
zu ersetzen Aussage. Aggregatfunktionen geben auch dann eine Zeile zurück, wenn die Tabelle leer ist.
Aber das brauchen Sie auch nicht. Verwenden Sie einfach den RETURNING
-Klausel, um die neue ID direkt zurückzugeben:
CREATE OR REPLACE FUNCTION f_test(
name text = NULL
, city text = NULL
, phonenumber text = NULL
, address text = NULL
, OUT sno bigint)
AS
$func$
BEGIN
RAISE NOTICE '%, %, %, %', name, city, phonenumber, address;
INSERT INTO emp(ename, ecity, ephonenumber, eaddress)
VALUES (name, city, phonenumber, address)
RETURNING ssno
INTO sno; -- Assuming you want to return autoincremented id
END
$func$ LANGUAGE plpgsql;