PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Hàm Postgres tạo nhưng không thực thi

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.

Tab
CREATE 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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để cài đặt luasql trên Linux Ubuntu 16?

  2. currval Hàm trong PostgreSQL phàn nàn rằng cột không tồn tại

  3. Làm cách nào để làm cho truy vấn SQL có khoảng cách địa lý này tương thích với Postgres

  4. Sửa các lỗ hổng / khoảng trống trong số được tạo bởi chuỗi Postgres

  5. Làm mới các chế độ xem cụ thể hóa với tính năng đồng thời