PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ERRO:parâmetros de entrada após um com valor padrão também devem ter padrões no Postgres


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 combinar RETURNS void com OUT 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 o RAISE nível INFO . Você deseja AVISO em vez de.

  • SELECIONAR sem destino não é possível no plpgsql, você quer SELECT INTO .

  • SE é finalizado com END IF não com END .

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;