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
avecOUT
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
niveauINFO
. Vous voulezNOTICE
à la place. -
SELECT
sans cible n'est pas possible dans plpgsql, vous voulezSELECT INTO
. -
IF
se termine parEND IF
pas 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;