Zakładając, że chcesz przekazać wartości od klienta . Jeśli wartości już istnieją w bazie danych, istnieją inne, prostsze sposoby.
Składnia tablicy typu composite_type
To, co możesz przekazać, wydaje się być ograniczone przez Typy Java i typy JDBC , i wydaje się, że nie ma przepisów dotyczących typów tablic, nie mówiąc już o tablicach wartości złożonych ...
Jednak zawsze możesz przekazać text
reprezentacja. Opieram się na dwóch podstawowych faktach:
- Cytując podręcznik :
Moje odważne podkreślenie. Dlatego po utworzeniu typu number_with_time
jak zdefiniowano w twoim pytaniu lub zdefiniowałeś tabelę z tymi samymi kolumnami, która automatycznie rejestruje typ wiersza w systemie, możesz również użyć typu tablicy number_with_time[]
.
- Istnieje
text
reprezentacja dla każdego wartość.
Dlatego istnieje również tekstowa reprezentacja dla number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Wywołanie funkcji
Rzeczywiste wywołanie funkcji zależy od wartości zwracanych zdefiniowanych w funkcji - która jest ukryta w pytaniu.
Aby uniknąć komplikacji związanych z obsługą tablic w JDBC, przekaż text
reprezentacja. Utwórz funkcję pobierając text
parametr.
Nie zamierzam używać nazwy „data” jako timestamp
. Praca z tą nieznacznie dostosowaną definicją typu:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Prosta funkcja SQL:
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$;
Zadzwoń:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db<>fiddle tutaj
Stary sqlfiddle
Demonstracja:
- powyżej funkcji SQL
- Wariant PL/pgSQL
- kilka wariantów składni dla tablicy typu złożonego
- wywołania funkcji
Wywołaj funkcję jak każdą inną funkcję pobierającą prosty text
parametr:
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();
Szczegóły w instrukcji Postgres JDBC tutaj.
Przykład, aby zwrócić całą tabelę przez JDBC: