PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

ERREUR:les paramètres d'entrée après un avec une valeur par défaut doivent également avoir des valeurs par défaut dans Postgres

Beaucoup de choses ne vont pas dans votre exemple. Ou plutôt :pas grand-chose est droit dans votre exemple.

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;

Points majeurs

  • Le message d'erreur parle de lui-même :

    C'est presque ce que le manuel a à ce sujet :

  • Cela n'aurait aucun sens de combiner RETURNS void avec OUT paramètres.

  • Ne déclarez pas les noms de variables en collision avec les noms de paramètres. Complètement inutile ici.

  • L'opérateur d'affectation plpgsql est := , pas = .

  • Vous n'utilisez pas normalement le RAISE niveau INFO . Vous voulez NOTICE à la place.

  • SELECT sans cible n'est pas possible dans plpgsql, vous voulez SELECT INTO .

  • IF se termine par END IF pas avec END .

Simplifier davantage

Utilisez COALESCE pour remplacer votre IF déclaration. Les fonctions d'agrégation renvoient une ligne même si la table est vide.
Mais vous n'en avez pas besoin non plus. Utilisez simplement le RETURNING clause pour renvoyer directement le nouvel identifiant :

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;