Angenommen, Sie möchten Werte vom Client übergeben . Wenn die Werte bereits in der Datenbank vorhanden sind, gibt es andere, einfachere Möglichkeiten.
Syntax für array of composite_type
Was Sie passieren können, scheint durch Java-Typen und JDBC-Typen , und es scheint keine Vorkehrungen für Array-Typen zu geben, ganz zu schweigen von Arrays zusammengesetzter Werte ...
Sie können jedoch immer einen text
übergeben Darstellung. Ich baue auf zwei grundlegende Tatsachen auf:
- Zitieren des Handbuchs :
Fette Hervorhebung von mir. Nachdem Sie also den Typ number_with_time
erstellt haben wie in Ihrer Frage definiert oder eine Tabelle mit denselben Spalten definiert, die den Zeilentyp automatisch im System registriert, können Sie auch den Array-Typ number_with_time[]
verwenden .
- Es gibt einen
text
Vertretung für alle Wert.
Daher gibt es auch eine Textdarstellung für number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Funktionsaufruf
Der eigentliche Funktionsaufruf hängt von den in Ihrer Funktion definierten Rückgabewerten ab - was in Ihrer Frage verborgen ist.
Um Komplikationen durch die Array-Verarbeitung in JDBC zu vermeiden, übergeben Sie den text
Darstellung. Erstellen Sie die Funktion mit einem text
Parameter.
Ich werde den Namen "Datum" nicht für einen timestamp
verwenden . Arbeiten mit dieser leicht angepassten Typdefinition:
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Einfache 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$;
Aufruf:
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db<>fiddle hier
Altes sqlfiddle
Demonstration:
- obige SQL-Funktion
- PL/pgSQL-Variante
- ein paar Syntaxvarianten für das Array des zusammengesetzten Typs
- die Funktion ruft auf
Rufen Sie die Funktion wie jede andere Funktion mit einem einfachen text
auf 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 im Postgres JDBC-Handbuch hier.
Beispiel für die Rückgabe einer ganzen Tabelle über JDBC: