En supposant que vous souhaitiez transmettre des valeurs du client . Si les valeurs existent déjà dans la base de données, il existe d'autres moyens plus simples.
Syntaxe pour tableau de type_composite
Ce que vous pouvez passer semble être limité par Types Java et types JDBC , et il ne semble pas y avoir de dispositions pour les types de tableau, sans parler des tableaux de valeurs composites...
Cependant, vous pouvez toujours passer un text
représentation. Je m'appuie sur deux faits fondamentaux :
- Citer le manuel :
Bold emphase mienne. Par conséquent, après avoir créé le type number_with_time
comme défini dans votre question, ou défini une table avec les mêmes colonnes qui enregistre automatiquement le type de ligne dans le système, vous pouvez également utiliser le type de tableau number_with_time[]
.
- Il y a un
text
représentation pour chaque valeur.
Par conséquent, il existe également une représentation textuelle pour number_with_time[]
:
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]
Appel de fonction
L'appel de fonction réel dépend des valeurs de retour définies dans votre fonction - qui sont cachées dans votre question.
Pour éviter les complications de la gestion des tableaux dans JDBC, passez le text
représentation. Créez la fonction en prenant un text
paramètre.
Je ne vais pas utiliser le nom "date" pour un timestamp
. Travailler avec cette définition de type légèrement ajustée :
CREATE TYPE number_with_time AS(
_num float
, _ts timestamp
);
Fonction SQL simple :
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$;
Appel :
SELECT myfunc_sql('{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}');
db<>violon ici
Ancien sqlfiddle
Démonstration :
- au-dessus de la fonction SQL
- Variante PL/pgSQL
- quelques variantes de syntaxe pour le tableau de type composite
- la fonction appelle
Appelez la fonction comme n'importe quelle autre fonction en prenant un simple text
paramètre :
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();
Détails dans le manuel Postgres JDBC ici.
Exemple pour retourner une table entière via JDBC :