PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

ERRORE:i parametri di input dopo uno con un valore predefinito devono avere valori predefiniti anche in Postgres

Molto non va bene nel tuo esempio. O meglio:non molto è proprio nel tuo esempio.

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;

Punti principali

  • Il messaggio di errore parla da sé:

    Questo è quasi quello che contiene il manuale :

  • Non avrebbe senso combinare RETURNS void con OUT parametri.

  • Non dichiarare i nomi delle variabili in conflitto con i nomi dei parametri. Completamente inutile qui.

  • L'operatore di assegnazione plpgsql è := , non = .

  • Normalmente non usi il RAISE livello INFO . Vuoi NOTICE invece.

  • SELECT senza target non è possibile in plpgsql, vuoi SELECT INTO .

  • IF termina con END IF non con END .

Semplifica ulteriormente

Usa COALESCE per sostituire il tuo IF dichiarazione. Le funzioni di aggregazione restituiscono una riga anche se la tabella è vuota.
Ma non è nemmeno necessario. Basta usare il RETURNING clausola per restituire direttamente il nuovo ID:

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;