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 voidcomOUTparâ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 oRAISEnívelINFO. Você desejaAVISOem vez de.
-
SELECIONARsem destino não é possível no plpgsql, você querSELECT INTO.
-
SEé finalizado comEND IFnã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;