Mucho no está bien en tu ejemplo. O mejor dicho:no mucho es justo en tu ejemplo.
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;
Puntos principales
-
El mensaje de error habla por sí solo:
Eso es casi lo que tiene el manual sobre eso :
-
No tendría sentido combinar
RETURNS void
conOUT
parámetros. -
No declare nombres de variables que colisionen con nombres de parámetros. Completamente inútil aquí.
-
El operador de asignación plpgsql es
:=
, no=
. -
Normalmente no usas el
RAISE
nivelINFO
. QuieresNOTICE
en su lugar. -
SELECT
sin objetivo no es posible en plpgsql, deseaSELECT INTO
. -
IF
termina conEND IF
no conEND
.
Simplificar aún más
Use COALESCE
para reemplazar su IF
declaración. Las funciones agregadas devuelven una fila incluso si la tabla está vacía.
Pero tampoco es necesario. Solo usa el RETURNING
cláusula para devolver la nueva identificación directamente:
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;