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:
- 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[]
.
- 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
cũ
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: