Não estou conseguindo colocar dados em uma função criada no postgresql

1 resposta
robson.berth

Olá a todos
Estou com uma dúvida.
Estou criando um sistema para cadastro de uma loja de eletrodomésticos, no qual eu criei uma função no próprio SGBD para fazer a inserção dos dados.
A função que eu tenho é esta:

CREATE OR REPLACE FUNCTION insereloja(cnpj bigint, nome character varying, rua character varying, cidade character varying, estado character varying, numero integer, telefone integer)
  RETURNS void AS
$BODY$
BEGIN
	INSERT INTO Loja VALUES (cnpj, nome, rua, cidade, estado, numero, telefone);
END
$BODY$
  LANGUAGE plpgsql

Porém, estou trabalhando com o java, juntamente com SGBD. Fiz a conexão certinho, e aparentemente tudo certo.
O problema está acontecendo quando eu passo os parâmetros pra função neste código:

public void insereLojanoBD(long cnpj, String nome,String rua, String cidade, String estado, int numero, int telefone){
            try{           
                Connection con;
                
                con = DriverManager.getConnection("jdbc:postgresql://localhost:5432/udesc", "robson", "");  
                Statement stm = con.createStatement();  
                stm.executeQuery("SELECT insereloja(cnpj,nome,rua,cidade,estado,numero,telefone)");            
                System.out.println("Loja inserida com sucesso");
            }catch(Exception e){
                e.printStackTrace();
            }

Aparece um erro falando que o cnpj não existe e vai pro catch.
Obs.: Se eu tentar colocar os valores manualmente, a função insere normalmente.

Obrigado galera!

1 Resposta

A

Vamos analisar seu comando primeiro:

"SELECT insereloja(cnpj,nome,rua,cidade,estado,numero,telefone)"

Em nenhum momento aqui você preenche os valores desses parâmetros. Você está tentando inserir um cnpj com valor cnpj , por exemplo.
Não vi a mensagem de erro, mas provavelmente o banco vai considerar cnpj uma variável (que não existe no escopo dele) e por isso dá erro.
Se puder informar a mensagem de erro exata, isso ficaria mais claro.

Enfim, o que você provavelmente quer fazer é o seguinte:

"SELECT insereloja(" + cnpj + "," + nome + "," + rua + "," + cidade + "," + estado + "," + numero + "," + telefone + ")"

Que aí sim você montará seu comando sql com os valores das variáveis no java que sua função insereLojanoBD recebe.

Resolvido essa parte (espero), algumas considerações:

  • Não use Statement. Nunca! Procure aprender como usar o PreparedStatement. Ou no seu caso, talvez até a CallableStatement.

  • Por que está utilizando uma função no Postgresql apenas para fazer insert? Por que não escrever o insert diretamente?
    Se for por performance, não se preocupe, não há diferença.

Criado 24 de junho de 2013
Ultima resposta 24 de jun. de 2013
Respostas 1
Participantes 2