sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgresql JDBC-tabel værdisatte parametre

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:

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

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



  1. SEC_TO_TIME() Eksempler – MySQL

  2. SQL Inner Join – Sådan forbinder du 3 tabeller i SQL og MySQL

  3. PHP MySql - Tjek om værdien findes

  4. Ekskluder matchede matrixelementer