PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Paramètres valorisés de la table JDBC Postgresql

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 :

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

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