PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Parâmetros com valor de tabela JDBC do Postgresql


Supondo que você queira passar valores do cliente . Se os valores já existirem no banco de dados, existem outras maneiras mais simples.

Sintaxe para matriz de tipo_composto


O que você pode passar parece ser limitado por Tipos Java e tipos JDBC , e não parece haver provisões para tipos de array, para não falar de arrays de valores compostos ...

No entanto, você sempre pode passar um text representação. Estou me baseando em dois fatos básicos:
  1. Citando o manual :

Minha ênfase em negrito. Portanto, depois de criar o tipo number_with_time conforme definido em sua pergunta, ou definiu uma tabela com as mesmas colunas que registra o tipo de linha no sistema automaticamente, você também pode usar o tipo de array number_with_time[] .
  1. Há um text representação para todos valor.

Portanto, há também uma representação de texto para number_with_time[] :
'{"(1,2014-04-20 20:00:00)","(2,2014-04-21 21:00:00)"}'::number_with_time[]

Chamada de função


A chamada de função real depende dos valores de retorno definidos em sua função - que está oculto em sua pergunta.

Para evitar complicações de manipulação de array em JDBC, passe o text representação. Crie a função pegando um text parâmetro.

Não vou usar o nome "data" para um timestamp . Trabalhando com esta definição de tipo ligeiramente ajustada:
CREATE TYPE number_with_time AS(
   _num float
 , _ts  timestamp
);

Função SQL simples:
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$;

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

db<>fiddle aqui
Antigo sqlfiddle

Demonstrando:
  • acima da função SQL
  • variante PL/pgSQL
  • algumas variantes de sintaxe para a matriz do tipo composto
  • as chamadas de função

Chame a função como qualquer outra função usando um simples 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(); 

Detalhes no manual Postgres JDBC aqui.

Exemplo para retornar uma tabela inteira via JDBC: