Forudsat at du vil videregive værdier fra klienten . Hvis værdierne allerede findes i databasen, er der andre, enklere måder.
Syntaks for array of composite_type
Hvad du kan bestå synes at være begrænset af Java-typer og JDBC-typer , og der ser ikke ud til at være bestemmelser om array-typer, for ikke at tale om arrays af sammensatte værdier ...
Du kan dog altid sende en text
repræsentation. Jeg bygger på to grundlæggende fakta:
- Citerer manualen :
Fed fremhævelse min. Derfor, efter at du har oprettet typen number_with_time
som defineret i dit spørgsmål, eller defineret en tabel med de samme kolonner, som automatisk registrerer rækketypen i systemet, kan du også bruge array-typen number_with_time[]
.
- Der er en
text
repræsentation for hver værdi.
Derfor er der også en tekstrepræsentation for number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Funktionskald
Selve funktionskaldet afhænger af returværdierne defineret i din funktion - som er skjult i dit spørgsmål.
For at undgå komplikationer fra array-håndtering i JDBC skal du sende text
repræsentation. Opret funktionen ved at bruge en text
parameter.
Jeg vil ikke bruge navnet "dato" til et timestamp
. Arbejder med denne let justerede typedefinition:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Simpel 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 til:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db<>fiddle her
Gamle sqlfiddle
Demonstrerer:
- over SQL-funktionen
- PL/pgSQL-variant
- et par syntaksvarianter for rækken af sammensat type
- funktionen kalder
Kald funktionen som enhver anden funktion med en simpel 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 her.
Eksempel på at returnere en hel tabel via JDBC: