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

Truyền bảng dưới dạng tham số

AS @dezso đã đề cập, bạn sẽ cần SQL động trong trường hợp này.

SQL động với EXECUTE

Vì vậy, bạn đang đi đúng hướng; tạo một câu lệnh SQL động bằng PL / pgSQL, nhưng bạn chỉ cần hoàn thiện:

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
RETURNS integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices 
  ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;

Tôi tin rằng điều này sẽ giải quyết được vấn đề của bạn.

Lưu ý:Chúng tôi đã phát hiện ra lỗi với giải pháp trên và sử dụng SETOF , Tôi đã cố gắng sửa các vấn đề bên dưới.

CHỈNH SỬA:

Một vài chỉnh sửa ở đây, hy vọng một giải pháp sẽ khắc phục được sự cố của bạn. Ngoài ra, vui lòng bỏ qua bất kỳ lỗi cú pháp nào trong các giải pháp trước đây &hiện tại của tôi; Tôi không có thời gian để kiểm tra chúng ngay bây giờ. :(

1) Bạn chỉ có thể thử trả lại SETOF số nguyên, biết rằng tất nhiên bạn sẽ chỉ trả về một. Khi đó, kiểu trả về của bạn trong trường hợp này sẽ là một hàng một cột, chứa một số nguyên.

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
RETURNS SETOF integer AS $$
BEGIN
RETURN QUERY EXECUTE format('SELECT id FROM %I AS vertices 
  ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table);
END
$$ LANGUAGE plpgsql;

và sau đó gọi là:

SELECT * FROM convert_from_lon_lat(...);

2) Để trả về cụ thể một số nguyên, tôi nghĩ bạn có thể thử cách này:

CREATE or REPLACE FUNCTION convert_from_lon_lat(long float, lat float, _table text) 
RETURNS integer AS $$

DECLARE
return_id integer;

BEGIN
EXECUTE format('SELECT id FROM %I AS vertices 
  ORDER BY vertices.geom <->ST_SetSrid(ST_MakePoint(long,lat),4326) LIMIT 1;',_table)
  INTO return_id;

RETURN return_id;
END
$$ LANGUAGE plpgsql;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Trình điều khiển HikariCP Postgresql Tuyên bố không chấp nhận URL JDBC

  2. Tìm tất cả các giao điểm của tất cả các tập hợp phạm vi trong PostgreSQL

  3. Lưu trữ PostgreSQL ARRAY của các giá trị ENUM

  4. Làm cách nào để chuyển dữ liệu từ AWS Postgres RDS sang S3 (sau đó là Redshift)?

  5. Làm cách nào để chèn đúng nhiều hàng vào PG với node-postgres?