Много не е правилно в твоя пример. Или по-скоро:не много е точно във вашия пример.
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;
Основни точки
-
Съобщението за грешка говори само за себе си:
Това е почти какво пише в ръководството :
-
Няма да има смисъл да комбинирате
RETURNS void
сOUT
параметри. -
Не декларирайте имена на променливи в конфликт с имена на параметри. Напълно безполезен тук.
-
Операторът за присвояване plpgsql е
:=код>
, а не=
. -
Обикновено не използвате
RAISE
нивоИНФО
. ИскатеИЗВЕСТИЕ
вместо това. -
ИЗБЕРЕТЕ
без цел не е възможно в plpgsql, искатеSELECT INTO
. -
АКО
се прекратява сEND IF
не сEND
.
Опростете допълнително
Използвайте COALESCEкод>
за да замените вашия IF
изявление. Агрегираните функции връщат ред, дори ако таблицата е празна.
Но вие също не се нуждаете от това. Просто използвайте ВРЪЩАНЕ
клауза за директно връщане на новия идентификатор:
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;