Ervan uitgaande dat u waarden wilt doorgeven van de klant . Als de waarden al in de database bestaan, zijn er andere, eenvoudigere manieren.
Syntaxis voor array van composiet_type
Wat je kunt passeren lijkt te worden beperkt door Java-typen en JDBC-typen , en er lijken geen voorzieningen te zijn voor arraytypes, om nog maar te zwijgen van arrays van samengestelde waarden ...
U kunt echter altijd een text
pass doorgeven vertegenwoordiging. Ik bouw voort op twee basisfeiten:
- Citeer de handleiding :
Vetgedrukte nadruk van mij. Daarom, nadat u het type number_with_time
. hebt aangemaakt zoals gedefinieerd in uw vraag, of een tabel heeft gedefinieerd met dezelfde kolommen die het rijtype automatisch in het systeem registreert, kunt u ook het arraytype number_with_time[]
gebruiken .
- Er is een
text
vertegenwoordiging voor elke waarde.
Daarom is er ook een tekstrepresentatie voor number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Functie-oproep
De daadwerkelijke functieaanroep hangt af van de geretourneerde waarden die zijn gedefinieerd in uw functie - die verborgen is in uw vraag.
Om complicaties bij het afhandelen van arrays in JDBC te voorkomen, geeft u de text
. door vertegenwoordiging. Maak de functie met een text
parameter.
Ik ga de naam "datum" niet gebruiken voor een timestamp
. Werken met deze licht aangepaste typedefinitie:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Eenvoudige SQL-functie:
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$;
Bel:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db<>fiddle hier
Oude sqlfiddle
Demonstreren:
- boven SQL-functie
- PL/pgSQL-variant
- een paar syntaxisvarianten voor de array van samengesteld type
- de functie roept
Roep de functie aan zoals elke andere functie met een eenvoudige 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();
Details in de Postgres JDBC-handleiding hier.
Voorbeeld om een hele tabel terug te sturen via JDBC: