Meget er ikke rigtigt i dit eksempel. Eller rettere:ikke meget er lige i dit eksempel.
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; Vigtige punkter
-
Fejlmeddelelsen taler for sig selv:
Det er næsten hvad manualen har om det :
-
Det ville ikke give mening at kombinere
RETURNS voidmedOUTparametre. -
Erklær ikke variabelnavne, der kolliderer med parameternavne. Fuldstændig ubrugelig her.
-
plpgsql-tildelingsoperatøren er
:=, ikke=. -
Du bruger normalt ikke
RAISEniveauINFO. Du vil haveBEMÆRKi stedet. -
VÆLGuden mål er ikke muligt i plpgsql, du vil haveSELECT INTO. -
HVISafsluttes medEND IFikke medEND.
Gør yderligere forenkling
Brug COALESCE
for at erstatte din IF udmelding. Samlede funktioner returnerer en række, selvom tabellen er tom.
Men det behøver du heller ikke. Brug bare RETURNING klausul for at returnere det nye id direkte:
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;