Veel klopt er niet in jouw voorbeeld. Of liever:niet veel is precies in jouw voorbeeld.
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;
Belangrijkste punten
-
De foutmelding spreekt voor zich:
Dat is bijna wat de handleiding daarover heeft :
-
Het zou geen zin hebben om
RETURNS void
. te combineren metOUT
parameters. -
Declareer geen variabelenamen die botsen met parameternamen. Totaal nutteloos hier.
-
De plpgsql-toewijzingsoperator is
:=
, niet=
. -
Normaal gesproken gebruik je de
RAISE
. niet niveauINFO
. U wiltNOTICE
in plaats daarvan. -
SELECT
zonder doel is niet mogelijk in plpgsql, je wiltSELECT INTO
. -
IF
wordt beëindigd metEND IF
niet metEND
.
Vereenvoudig verder
Gebruik COALESCE
ter vervanging van uw IF
uitspraak. Geaggregeerde functies retourneren een rij, zelfs als de tabel leeg is.
Maar dat heb je ook niet nodig. Gebruik gewoon de RETURNING
clausule om de nieuwe id direct terug te geven:
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;