sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgresql JDBC-tabellvärderade parametrar

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:

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

  1. 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)"}');

db<>fiol här
Gammal sqlfiddle

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:



  1. Glömt lösenordsskript PHP mysqli

  2. Blir index snabbare än> jämförelse i MySQL?

  3. SET-operatorer i SQL

  4. Fel- ORA-22835:Bufferten är för liten för konvertering från CLOB till CHAR eller BLOB till RAW