Za předpokladu, že chcete předávat hodnoty od klienta . Pokud hodnoty již v databázi existují, existují jiné, jednodušší způsoby.
Syntaxe pro pole kompozitního_typu
Zdá se, že to, co můžete předat, je omezeno Typy Java a typy JDBC a zdá se, že neexistují ustanovení pro typy polí, nemluvě o polích složených hodnot ...
Vždy však můžete předat text
zastoupení. Stavím na dvou základních faktech:
- Citování příručky :
Odvážný důraz můj. Proto po vytvoření typu number_with_time
jak je definováno ve vaší otázce nebo definována tabulka se stejnými sloupci, která automaticky registruje typ řádku v systému, můžete také použít typ pole number_with_time[]
.
- Je tam
text
zastoupení pro každého hodnotu.
Proto existuje také textová reprezentace pro number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Volání funkce
Skutečné volání funkce závisí na návratových hodnotách definovaných ve vaší funkci – což je skryto ve vaší otázce.
Chcete-li se vyhnout komplikacím při manipulaci s poli v JDBC, předejte text
zastoupení. Vytvořte funkci pomocí text
parametr.
Nebudu používat název "datum" pro timestamp
. Práce s touto mírně upravenou definicí typu:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Jednoduchá funkce 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$;
Volejte:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db<>fiddle zde
Starý sqlfiddle
Demonstrace:
- nad funkcí SQL
- Varianta PL/pgSQL
- několik variant syntaxe pro pole složeného typu
- volání funkce
Volejte funkci jako kteroukoli jinou funkci s jednoduchým 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();
Podrobnosti v příručce Postgres JDBC zde.
Příklad vrácení celé tabulky přes JDBC: