PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

FEHLER:Eingabeparameter nach einem mit einem Standardwert müssen auch Standardwerte in Postgres haben

An deinem Beispiel stimmt vieles nicht. Oder besser gesagt:nicht viel ist rechts in deinem Beispiel.

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;

Wichtige Punkte

  • Die Fehlermeldung spricht für sich:

    Das ist fast was das Handbuch dazu sagt :

  • Es würde keinen Sinn machen, RETURNS void zu kombinieren mit OUT Parameter.

  • Deklarieren Sie keine Variablennamen, die mit Parameternamen kollidieren. Völlig nutzlos hier.

  • Der plpgsql-Zuweisungsoperator ist := , nicht = .

  • Normalerweise verwenden Sie RAISE nicht Ebene INFO . Sie möchten NOTICE stattdessen.

  • SELECT ohne Ziel ist in plpgsql nicht möglich, Sie wollen SELECT INTO .

  • IF wird mit END IF abgeschlossen nicht mit END .

Weiter vereinfachen

Verwenden Sie COALESCE um Ihr IF zu ersetzen Aussage. Aggregatfunktionen geben auch dann eine Zeile zurück, wenn die Tabelle leer ist.
Aber das brauchen Sie auch nicht. Verwenden Sie einfach den RETURNING -Klausel, um die neue ID direkt zurückzugeben:

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;