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
conOUT
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
livelloINFO
. VuoiNOTICE
invece. -
SELECT
senza target non è possibile in plpgsql, vuoiSELECT INTO
. -
IF
termina conEND IF
non conEND
.
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;