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

Các thông số có giá trị của bảng Postgresql JDBC

Giả sử bạn muốn chuyển các giá trị từ máy khách . Nếu các giá trị tồn tại trong cơ sở dữ liệu thì có những cách khác, đơn giản hơn.

Cú pháp cho array of composite_type

Những gì bạn có thể vượt qua dường như bị giới hạn bởi Loại Java và Loại JDBC và dường như không có quy định cho các loại mảng, không nói đến các mảng có giá trị tổng hợp ...

Tuy nhiên, bạn luôn có thể chuyển text sự đại diện. Tôi đang xây dựng dựa trên hai sự thật cơ bản:

  1. Trích dẫn hướng dẫn :

Tôi nhấn mạnh đậm. Do đó, sau khi bạn tạo xong loại number_with_time như được định nghĩa trong câu hỏi của bạn hoặc xác định một bảng có cùng các cột đăng ký loại hàng trong hệ thống tự động, bạn cũng có thể sử dụng kiểu mảng number_with_time[] .

  1. Có một text đại diện cho mọi giá trị.

Do đó, cũng có một đại diện văn bản cho number_with_time[] :

'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]

Lệnh gọi hàm

Lệnh gọi hàm thực sự phụ thuộc vào các giá trị trả về được xác định trong hàm của bạn - giá trị này bị ẩn trong câu hỏi của bạn.

Để tránh các biến chứng do xử lý mảng trong JDBC, hãy chuyển text sự đại diện. Tạo hàm lấy text tham số.

Tôi sẽ không sử dụng tên "date" cho timestamp . Làm việc với định nghĩa loại được điều chỉnh một chút này:

CREATE TYPE number_with_time AS(
   _num float
 , _ts  timestamp
);

Hàm SQL đơn giản:

CREATE OR REPLACE FUNCTION myfunc_sql(_arr_txt text)
  RETURNS integer       -- example
  LANGUAGE sql AS
$func$
   SELECT sum(_num)::int
   FROM   unnest (_arr_txt::number_with_time[]) x
   WHERE  _ts > '2014-04-19 20:00:00';
$func$;

Gọi:

SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');

db <> fiddle tại đây
sqlfiddle

Minh chứng:

  • trên hàm SQL
  • Biến thể PL / pgSQL
  • một vài biến thể cú pháp cho mảng kiểu kết hợp
  • hàm gọi

Gọi hàm giống như bất kỳ hàm nào khác bằng cách sử dụng text đơn giản tham số:

CallableStatement myProc = conn.prepareCall("{ ? = call myfunc_sql( ? ) }");
myProc.registerOutParameter(1, Types.VARCHAR);
// you have to escape double quotes in a Java string!
myProc.setString(2, "{\"(1,2014-04-20 20:00:00)\",\"(2,2014-04-21 21:00:00)\"}");
myProc.execute();
String mySum = myProc.getInt(1);
myProc.close(); 

Chi tiết trong hướng dẫn Postgres JDBC tại đây.

Ví dụ để trả về toàn bộ bảng qua JDBC:



  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 cách nào để gửi một số yêu cầu http từ hàm postgresql hoặc trình kích hoạt

  2. GeoServer sẽ không ghi vào chế độ xem có thể cập nhật PostgreSQL của tôi

  3. Tham chiếu một hàng từ một bảng khác (PostgreSQL)

  4. Nhận đối tượng lồng nhau trong cấu trúc trong gorm

  5. Postgres pg_toast trong autovacuum - bảng nào?