Muito não está certo no seu exemplo. Ou melhor:não muito é certo no seu exemplo.
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;
Pontos principais
-
A mensagem de erro fala por si:
Isso é quase o que o manual tem sobre isso :
-
Não faria sentido combinarRETURNS void
comOUT
parâmetros.
-
Não declare nomes de variáveis colidindo com nomes de parâmetros. Completamente inútil aqui.
-
O operador de atribuição plpgsql é:=
, não=
.
-
Você normalmente não usa oRAISE
nívelINFO
. Você desejaAVISO
em vez de.
-
SELECIONAR
sem destino não é possível no plpgsql, você querSELECT INTO
.
-
SE
é finalizado comEND IF
não comEND
.
Simplifique ainda mais
Use
COALESCE
para substituir seu IF
declaração. Funções agregadas retornam uma linha mesmo que a tabela esteja vazia.Mas você também não precisa disso. Basta usar o
RETURNING
cláusula para retornar o novo id diretamente: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;