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 void
zOUT
parametry. -
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
RAISE
poziomINFO
. ChceszUWAGA
zamiast tego. -
WYBIERZ
bez celu nie jest możliwe w plpgsql, chceszWYBIERZ DO
. -
JEŻELI
jest zakończony przezEND IF
nie 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;