Mycket stämmer inte i ditt exempel. Eller snarare:inte mycket är precis i ditt exempel.
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;
Huvudpunkter
-
Felmeddelandet talar för sig självt:
Det är nästan vad handboken har om det :
-
Det skulle inte vara vettigt att kombinera
RETURNS void
medOUT
parametrar. -
Deklarera inte variabelnamn som kolliderar med parameternamn. Helt värdelöst här.
-
plpgsql-tilldelningsoperatorn är
:=
, inte=
. -
Du använder normalt inte
RAISE
nivåINFO
. Du vill haOBS
istället. -
VÄLJ
utan mål är inte möjligt i plpgsql, du vill haSELECT INTO
. -
OM
avslutas medEND IF
inte medEND
.
Förenkla ytterligare
Använd COALESCE
för att ersätta din IF
påstående. Aggregatfunktioner returnerar en rad även om tabellen är tom.
Men det behöver du inte heller. Använd bara RETURNING
klausul för att returnera det nya ID:t direkt:
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;