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