Banyak yang tidak benar dalam contoh Anda. Atau lebih tepatnya:tidak banyak adalah tepat dalam contoh Anda.
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;
Poin utama
-
Pesan kesalahan berbicara sendiri:
Itu hampir apa yang ada di manual itu :
-
Tidak masuk akal untuk menggabungkan
RETURNS void
denganOUT
parameter. -
Jangan mendeklarasikan nama variabel bertabrakan dengan nama parameter. Sama sekali tidak berguna di sini.
-
operator penetapan plpgsql adalah
:=
, bukan=
. -
Anda biasanya tidak menggunakan
RAISE
tingkatINFO
. Anda inginNOTICE
sebagai gantinya. -
SELECT
tanpa target tidak mungkin di plpgsql, Anda inginSELECT INTO
. -
IF
diakhiri denganEND IF
bukan denganEND
.
Sederhanakan lebih lanjut
Gunakan COALESCE
untuk mengganti IF
penyataan. Fungsi agregat mengembalikan sebuah baris meskipun tabelnya kosong.
Tapi Anda juga tidak membutuhkannya. Cukup gunakan RETURNING
klausa untuk mengembalikan id baru secara langsung:
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;