Förutsatt att du vill skicka värden från klienten . Om värdena redan finns i databasen finns det andra, enklare sätt.
Syntax för array of composite_type
Vad du kan passera verkar vara begränsat av Javatyper och JDBC-typer , och det verkar inte finnas bestämmelser för matristyper, för att inte tala om matriser med sammansatta värden ...
Du kan dock alltid skicka en text
representation. Jag bygger på två grundläggande fakta:
- Citerar handboken :
Djärv betoning min. Därför, efter att du har skapat typen number_with_time
som definierats i din fråga, eller definierat en tabell med samma kolumner som registrerar radtypen i systemet automatiskt, kan du också använda arraytypen number_with_time[]
.
- Det finns en
text
representation för alla värde.
Därför finns det också en textrepresentation för number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Funktionsanrop
Det faktiska funktionsanropet beror på returvärdena definierade i din funktion - som är gömda i din fråga.
För att undvika komplikationer från arrayhantering i JDBC, skicka text
representation. Skapa funktionen med en text
parameter.
Jag kommer inte att använda namnet "datum" för en timestamp
. Arbetar med denna något justerade typdefinition:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Enkel SQL-funktion:
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$;
Ring:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
Demonstrerar:
- ovanför SQL-funktionen
- PL/pgSQL-variant
- ett par syntaxvarianter för arrayen av sammansatt typ
- funktionen anropar
Kalla funktionen som vilken annan funktion som helst med en enkel text
parameter:
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();
Detaljer i Postgres JDBC-manualen här.
Exempel för att returnera en hel tabell via JDBC: