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 voidavecOUTparamè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
RAISEniveauINFO. Vous voulezNOTICEà la place. -
SELECTsans cible n'est pas possible dans plpgsql, vous voulezSELECT INTO. -
IFse termine parEND IFpas avecEND.
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;