W twoim przykładzie wiele jest nie tak. A raczej:niewiele jest w twoim przykładzie.
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; Główne punkty
-
Komunikat o błędzie mówi sam za siebie:
To prawie co zawiera podręcznik :
-
Nie ma sensu łączyć
RETURNS voidzOUTparametry. -
Nie deklaruj nazw zmiennych kolidujących z nazwami parametrów. Całkowicie bezużyteczne tutaj.
-
plpgsql operator przypisania to
:=, a nie=. -
Zwykle nie używasz
RAISEpoziomINFO. ChceszUWAGAzamiast tego. -
WYBIERZbez celu nie jest możliwe w plpgsql, chceszWYBIERZ DO. -
JEŻELIjest zakończony przezEND IFnie zEND.
Dalsze uproszczenie
Użyj COALESCE
zastąpić IF oświadczenie. Funkcje agregujące zwracają wiersz, nawet jeśli tabela jest pusta.
Ale tego też nie potrzebujesz. Po prostu użyj ZWROT klauzula zwracająca nowy identyfikator bezpośrednio:
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;