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 void
medOUT
parametre. -
Erklær ikke variabelnavne, der kolliderer med parameternavne. Fuldstændig ubrugelig her.
-
plpgsql-tildelingsoperatøren er
:=
, ikke=
. -
Du bruger normalt ikke
RAISE
niveauINFO
. Du vil haveBEMÆRK
i stedet. -
VÆLG
uden mål er ikke muligt i plpgsql, du vil haveSELECT INTO
. -
HVIS
afsluttes medEND IF
ikke 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;