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 voidconOUTpará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
RAISEnivelINFO. QuieresNOTICEen su lugar. -
SELECTsin objetivo no es posible en plpgsql, deseaSELECT INTO. -
IFtermina conEND IFno 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;