Ve vašem příkladu toho není mnoho. Nebo spíše:nic moc je přímo ve vašem příkladu.
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;
Hlavní body
-
Chybová zpráva mluví sama za sebe:
To je téměř co o tom má příručka :
-
Nedávalo by smysl kombinovat
RETURNS void
sOUT
parametry. -
Nedeklarujte názvy proměnných kolidující s názvy parametrů. Tady úplně k ničemu.
-
Operátor přiřazení plpgsql je
:=
, nikoli=
. -
Běžně nepoužíváte
RAISE
úroveňINFO
. ChceteNOTICE
místo toho. -
VYBRAT
bez cíle není v plpgsql možné, chceteSELECT INTO
. -
IF
je ukončenoEND IF
ne sEND
.
Další zjednodušení
Použijte COALESCE
k nahrazení vašeho IF
tvrzení. Agregační funkce vrátí řádek, i když je tabulka prázdná.
Ale ani to nepotřebujete. Stačí použít VRÁCENÍ
klauzule pro přímé vrácení nového 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;