Nhiều điều không đúng trong ví dụ của bạn. Hay đúng hơn:không nhiều là ngay trong ví dụ của bạn.
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;
Những điểm chính
-
Thông báo lỗi tự nói lên:
Đó gần như là những gì hướng dẫn sử dụng :
-
Sẽ không hợp lý nếu kết hợp
RETURNS void
vớiOUT
tham số. -
Không khai báo tên biến xung đột với tên tham số. Hoàn toàn vô dụng ở đây.
-
toán tử gán plpgsql là
:=
, không phải=
. -
Bạn thường không sử dụng
RAISE
cấp độTHÔNG TIN
. Bạn muốnTHÔNG BÁO
thay vào đó. -
CHỌN
không có mục tiêu là không thể trong plpgsql, bạn muốnCHỌN VÀO
. -
IF
được kết thúc bằngEND IF
không bằngEND
.
Đơn giản hóa hơn nữa
Sử dụng COALESCE
để thay thế IF
của bạn bản tường trình. Các hàm tổng hợp trả về một hàng ngay cả khi bảng trống.
Nhưng bạn cũng không cần điều đó. Chỉ cần sử dụng RETURNING
mệnh đề để trả về id mới trực tiếp:
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;