PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Parameter mit Postgresql-JDBC-Tabellenwerten

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:

  1. 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 .

  1. 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: