Chamar função (function) postgresql em JDBC

Boa noite,

eu criei a seguiinte função:

create or replace function inserirPedidoProduto(
int,
int,
int,
real
)
returns boolean as $$

declare 
idOcupacao2 alias for $1;
idProduto2 alias for $2;
quantidade2 alias for $3;
total2 alias for $4;
teste record;
begin

select 
into  teste *
from PedidoProduto
where idOcupacao = idOcupacao2 AND idProduto = idProduto2;

if not found then 
	insert into PedidoProduto 
	values (idOcupacao2, idProduto2, quantidade2, total2);
else 
	update PedidoProduto
	set	quantidade = (quantidade + quantidade2),
		total = (total + total2)
        where idOcupacao = idOcupacao2 
        AND idProduto = idProduto2;
end if;

return true;
end;
$$ language 'plpgsql';		

e a classe que executa, eu já tentei com prepareCall e com prepareStatement mas os dois métodos retornam o mesmo erro.

Eis os atributos e métodos que executam a função:

    private static final String inserirPedidoPratoSQL = "select inserirPedidoPrato (?, ?, ?, ?, ?)";
    private static CallableStatement inserirPedidoPrato = null;

    public static void inserirPedidoPrato(PedidoPrato pp) throws ClassNotFoundException, SQLException {
        if (inserirPedidoPrato == null) {
            inserirPedidoPrato = Conectar.open().prepareCall(inserirPedidoPratoSQL);
        }
        

        inserirPedidoPrato.setInt(1, pp.getOcupacao().getId());
        inserirPedidoPrato.setInt(2, pp.getPrato().getId());
        inserirPedidoPrato.setInt(3, pp.getQuantidade());

        try{
            inserirPedidoPrato.setInt(4, pp.getModificacao().getId());
        }catch(Exception e){
            //nao tem modificacao
            inserirPedidoPrato.setInt(4, 0);
        }
        inserirPedidoPrato.setDouble(5, pp.getTotal());

        inserirPedidoPrato.execute();
    }

Eis o erro lançado pelo postgreSQL:

org.postgresql.util.PSQLException: ERRO: função inserirpedidoprato(integer, integer, integer, integer, double precision) não existe
  Dica: Nenhuma função corresponde com o nome e os tipos de argumentos informados. Você precisa adicionar conversões de tipo explícitas.
  Posição: 8
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2103)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1836)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:257)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:512)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:388)
	at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:381)
	at Persistencia.venda.materiaPrima.VendaPratoService.inserirPedidoPrato(VendaPratoService.java:69)

Linha que 29 da classe VendaPratoService é:

inserirPedidoPrato.execute();

Alguém pode me ajudar?
abrazz

Se eu não estiver vendo gnomos… você criou a função com o nome de InserirPedidoProduto e está tentando chamá-la no código como inserirPedidoPrato logo alí na linha 1 do seu segundo bloco de código.

ah desculpa, é pq eu criei as duas…
É verdade, é inserirPedidoPrato mesmo,
olha lá na excessão pra vc ver…

obrigado e desculpa,
na hora de criar o topico copiei a funcao errada…
mas é basicamente a msma coisa…

pode me ajudar?

Baseado na mensagem retornada na exception, já que descartamos o nome da função estar incorreto, só sobra uma opção: um dos tipos de dado dos argumentos passados para a função não está sendo convertido corretamente. E eu arriscaria neste caso o último deles, que na sua função está definido como real e na chamada que você faz no código java você tá passando um double. Esse mapeamento de tipos SQL pra JDBC me parece variar de banco pra banco, mas acho então que vc poderia testar outros tipos. Se fosse DB2, pelo que pesquisei, vc deveria usar float no java.

Eu tentei com float e não consegui… Infelizmente :frowning:

então o que eu fiz foi, mudar o tipo de real para double precision
e continuar usando o double.

Obrigado pela ajuda meu amigo.
Abraço!