sql >> Base de Datos >  >> RDS >> PostgreSQL

Parámetros con valores de la tabla JDBC de Postgresql

Suponiendo que desea pasar valores del cliente . Si los valores ya existen en la base de datos, existen otras formas más sencillas.

Sintaxis para matriz de tipo_compuesto

Lo que puede pasar parece estar limitado por Tipos Java y tipos JDBC , y no parece haber provisiones para tipos de matrices, por no hablar de matrices de valores compuestos...

Sin embargo, siempre puedes pasar un text representación. Me baso en dos hechos básicos:

  1. Citando el manual :

Énfasis en negrita mío. Por lo tanto, después de haber creado el tipo number_with_time como se define en su pregunta, o definió una tabla con las mismas columnas que registra el tipo de fila en el sistema automáticamente, también puede usar el tipo de matriz number_with_time[] .

  1. Hay un text representación para cada valor.

Por lo tanto, también hay una representación de texto para number_with_time[] :

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

Llamada de función

La llamada de función real depende de los valores de retorno definidos en su función, que está oculto en su pregunta.

Para evitar complicaciones del manejo de arreglos en JDBC, pase el text representación. Crea la función tomando un text parámetro.

No voy a usar el nombre "fecha" para una timestamp . Trabajando con esta definición de tipo ligeramente ajustada:

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

Función 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$;

Llamar:

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

db<>fiddle aquí
Antiguo sqlfiddle

Demostrando:

  • sobre la función SQL
  • Variante PL/pgSQL
  • un par de variantes de sintaxis para la matriz de tipo compuesto
  • la función llama

Llame a la función como cualquier otra función tomando un simple text parámetro:

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

Detalles en el manual JDBC de Postgres aquí.

Ejemplo para devolver una tabla completa a través de JDBC: