sql >> Base de Datos >  >> RDS >> PostgreSQL

ERROR:los parámetros de entrada después de uno con un valor predeterminado también deben tener valores predeterminados en Postgres

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 con OUT 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 nivel INFO . Quieres NOTICE en su lugar.

  • SELECT sin objetivo no es posible en plpgsql, desea SELECT INTO .

  • IF termina con END IF no con END .

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;