Tôi đã gặp trường hợp tương tự - chức năng với danh sách tham số rộng. Với cái gọi là tham số được đặt tên , bạn không cần phải tôn trọng thứ tự các tham số. Mã dài hơn, nhưng (tôi hy vọng) dễ đọc hơn và mạnh mẽ hơn.
TabCREATE TABLE tab(name text, surname text, address text, city text, zip text);
CREATE OR REPLACE FUNCTION public.fx(name text, surname text,
address text, city text, zip text)
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO tab(name, surname, address, city, zip)
VALUES(fx.name, fx.surname, fx.address, fx.city, fx.zip);
-- ... some other logic
END;
$function$
Hàm này có thể được gọi với các tham số được đặt tên ký hiệu:
SELECT fx(name := 'Pavel', surname := 'Stehule',
address := 'Skalice 12', city := 'Benesov', zip := '12');
Chú ý:Khi tôi sử dụng sai loại - Postgres báo cáo thông báo:
postgres=# SELECT fx(name := 'Pavel', surname := 'Stehule', address := 'Skalice 12', city := 'Benesov', zip := 12); ERROR: function fx(name := unknown, surname := unknown, address := unknown, city := unknown, zip := integer) does not exist LINE 1: SELECT fx(name := 'Pavel', surname := 'Stehule', ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Tin nhắn hợp lệ, nhưng nó không sạch sẽ. Đó là một chi phí hỗ trợ quá tải chức năng. Có một mẹo khác, cách phân chia danh sách tham số dài và cách tìm những vấn đề này một cách thoải mái hơn.
Postgres hỗ trợ các loại tùy chỉnh. Bạn có thể sử dụng nó:
CREATE TYPE person_type AS (name text, surname text);
CREATE TYPE address_type AS (address text, city text, zip text);
bạn có thể viết một hàm tạo:
CREATE OR REPLACE FUNCTION public._person_type(name text, surname text)
RETURNS person_type
LANGUAGE plpgsql
AS $function$
DECLARE r person_type;
BEGIN
r.name = name;
r.surname = surname;
RETURN r;
END;
$function$
CREATE OR REPLACE FUNCTION public._address_type(address text, city text, zip text)
RETURNS address_type
LANGUAGE plpgsql
AS $function$ DECLARE r address_type;
BEGIN
r.address = address;
r.city = city;
r.zip = zip;
RETURN r;
END;
$function$
Việc tạo ra hệ thống này cần một số công việc và nó chỉ thực tế cho các hệ thống tồn tại lâu dài. Mặt khác, nó giảm chi phí cho việc duy trì công việc trong tương lai.
CREATE OR REPLACE FUNCTION public.fx(p person_type, a address_type)
RETURNS void
LANGUAGE plpgsql
AS $function$
BEGIN
INSERT INTO tab(name, surname, address, city, zip)
VALUES(p.name, p.surname, a.address, a.city, a.zip);
-- ... some other logic
END;
$function$
Giờ đây, có thể có nhiều ký hiệu hơn (kết hợp các ký hiệu):
postgres=# SELECT fx(_person_type('Pavel','Stehule'),
postgres(# _address_type('Skalice 12','Benesov', '25601'));
fx
----
(1 row)
Trình tạo giúp bản địa hóa lỗi:
postgres=# SELECT fx(_person_type('Pavel','Stehule'), _address_type('Skalice 12','Benesov', 25601)); ERROR: function _address_type(unknown, unknown, integer) does not exist LINE 2: _address_type('Skalice 12','Benesov', 25601)); ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.