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

Parametri con valori di tabella JDBC Postgresql

Supponendo che tu voglia trasmettere valori dal cliente . Se i valori esistono già nel database ci sono altri modi più semplici.

Sintassi per array di tipo_composito

Ciò che puoi passare sembra essere limitato da Tipi Java e tipi JDBC , e non sembrano esserci disposizioni per i tipi di array, per non parlare di array di valori composti ...

Tuttavia, puoi sempre passare un text rappresentazione. Sto basandomi su due fatti fondamentali:

  1. Citando il manuale :

Enfasi in grassetto mio. Pertanto, dopo aver creato il tipo number_with_time come definito nella tua domanda, o definita una tabella con le stesse colonne che registra automaticamente il tipo di riga nel sistema, puoi anche utilizzare il tipo di matrice number_with_time[] .

  1. C'è un text rappresentanza per ogni valore.

Pertanto, esiste anche una rappresentazione testuale per number_with_time[] :

'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]

Chiamata di funzione

La chiamata alla funzione effettiva dipende dai valori di ritorno definiti nella tua funzione, che è nascosta nella tua domanda.

Per evitare complicazioni dovute alla gestione degli array in JDBC, passare il text rappresentazione. Crea la funzione prendendo un text parametro.

Non userò il nome "data" per un timestamp . Lavorare con questa definizione di tipo leggermente modificata:

CREATE TYPE number_with_time AS(
   _num float
 , _ts  timestamp
);

Semplice funzione SQL:

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$;

Chiama:

SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');

db<>violino qui
Vecchio sqlfiddle

Dimostrando:

  • sopra la funzione SQL
  • Variante PL/pgSQL
  • un paio di varianti di sintassi per l'array di tipo composito
  • la funzione chiama

Chiama la funzione come qualsiasi altra funzione prendendo un semplice text parametro:

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(); 

Dettagli nel manuale Postgres JDBC qui.

Esempio per restituire un'intera tabella tramite JDBC: