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 metOUTparameters. -
Declareer geen variabelenamen die botsen met parameternamen. Totaal nutteloos hier.
-
De plpgsql-toewijzingsoperator is
:=, niet=. -
Normaal gesproken gebruik je de
RAISE. niet niveauINFO. U wiltNOTICEin plaats daarvan. -
SELECTzonder doel is niet mogelijk in plpgsql, je wiltSELECT INTO. -
IFwordt beëindigd metEND IFniet 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;