Problemas com Function Postgre / JAVA

PostgreSQL

02/07/2014

Criei uma FUNCTION no Postgre 9.3 para rodar 5 insert´s simultaneos onde cada insert corresponde a uma tabela diferente (generalização e especialização) quando eu executo a function no Execute Query do pgAdmin III retorna um campo (tipo select)

| |fisica_insert |

|_|void |

|1| |

Quando eu chamo essa function pelo Netbeans 8.0 retorna uma Exception:

ERRO SQL: Um resultado foi retornado quando nenhum era esperado.

Mas todos os dados são inseridos corretamente. A dúvida é:

Como tratar essa Exception?

FUNCTION:

CREATE OR REPLACE FUNCTION fisica_insert(nome varchar, vcpf varchar, vrg varchar, data_nascimento date, estado_civil varchar, nacionalidade varchar, tratamento varchar, profissao varchar, logradouro varchar, numero varchar, bairro varchar, complemento varchar, cep varchar, cidade varchar, uf varchar, tel_1 varchar, ramal_1 varchar, tel_2 varchar, ramal_2 varchar, tel_3 varchar, tel_4 varchar, ramal_4 varchar, email varchar, paginaweb varchar)

RETURNS VOID AS


$$
DECLARE
BEGIN
INSERT INTO pessoa(nome)
VALUES (nome);
INSERT INTO fisica(cpf, rg, pessoa_idPessoa, data_nascimento, estado_civil, nacionalidade)
VALUES (vcpf, vrg, (select max(idpessoa)from pessoa), data_nascimento, estado_civil, nacionalidade);
INSERT INTO cliente(pessoa_idPessoa, fisica_rg, fisica_cpf, tratamento, profissao)
VALUES ((select max(idpessoa)from pessoa), (select rg from fisica where pessoa_idPessoa=(select max(idpessoa)from pessoa)), (select cpf from fisica where pessoa_idPessoa=(select max(idpessoa)from pessoa)), tratamento, profissao);
INSERT INTO endereco(pessoa_idPessoa, logradouro, numero, bairro, complemento, cep, cidade, uf)
VALUES ((select max(idpessoa)from pessoa), logradouro, numero, bairro, complemento, cep, cidade, uf);
INSERT INTO contato(pessoa_idPessoa, tel_1, ramal_1, tel_2, ramal_2, tel_3, tel_4, ramal_4, email, paginaWeb)
VALUES ((select max(idpessoa)from pessoa), tel_1, ramal_1, tel_2, ramal_2, tel_3, tel_4, ramal_4, email, paginaWeb);
END;
$$
LANGUAGE plpgsql

Chamando a function:

SELECT fisica_insert('FISICA INSERT', '22222222222', '22222222-2', '22-02-2002', 'SOLTEIRO', 'BRASILEIRO', 'SR.', 'TESTER', 'RUA TESTE FUNCTION', '222', 'BAIRRO TESTE', 'APTO. 22', '22222-222', 'TESTE CIDADE', 'TS', '1192222-2222', 'VIVO', '1193333-3333', 'CLARO', '112222-2222', '113333-3333', '33', 'TESTE@FUNCTION.COM.BR', 'WWW.TESTEFUNCTION.COM.BR');

Código JAVA:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
final String url = "jdbc:postgresql://localhost:5432/nome_do_banco";
final String user = "usuário";
final String senha = "senha";
String tratamento = null;

if(jRadioButton_Sr.isSelected()){
tratamento = jRadioButton_Sr.getText();
}else if(jRadioButton_Sra.isSelected()){
tratamento = jRadioButton_Sra.getText();
}else if(jRadioButton_Dr.isSelected()){
tratamento = jRadioButton_Dr.getText();
}else if(jRadioButton_Dra.isSelected()){
tratamento = jRadioButton_Dra.getText();
}

try{
Connection conexao = DriverManager.getConnection(url, user, senha);

PreparedStatement cliente = conexao.prepareStatement("SELECT fisica_insert(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

cliente.setString(1, jTextField_Nome.getText());
cliente.setString(2, jTextField_CPF.getText());
cliente.setString(3, jTextField_RG.getText());
cliente.setDate(4, Date.valueOf(jTextField_Nascimento.getText()));
cliente.setString(5, jTextField_EstadoCivil.getText());
cliente.setString(6, jTextField_Nacionalidade.getText());
cliente.setString(7, (String)tratamento);
cliente.setString(8, jTextField_Profissao.getText());
cliente.setString(9, jTextField_Logradouro.getText());
cliente.setString(10, jTextField_Numero.getText());
cliente.setString(11, jTextField_Bairro.getText());
cliente.setString(12, jTextField_Complemento.getText());
cliente.setString(13, jTextField_CEP.getText());
cliente.setString(14, jTextField_Cidade.getText());
cliente.setString(15, (String)jComboBox_Estado.getSelectedItem());
cliente.setString(16, jTextField_Tel1.getText());
cliente.setString(17, (String)jComboBox_Tel1.getSelectedItem());
cliente.setString(18, jTextField_Tel2.getText());
cliente.setString(19, (String)jComboBox_Tel2.getSelectedItem());
cliente.setString(20, jTextField_Tel3.getText());
cliente.setString(21, jTextField_Tel4.getText());
cliente.setString(22, jTextField_Ramal4.getText());
cliente.setString(23, jTextField_Email.getText());
cliente.setString(24, jTextField_PaginaWeb.getText());

int result = cliente.executeUpdate();

JOptionPane.showMessageDialog(null, "Cadastro Efetuado! "+ result +" linhas afetadas");

}catch(SQLException e){
JOptionPane.showMessageDialog(null, "ERRO SQL: " + e.getMessage());
e.printStackTrace();
}
}

Se alguém puder ajudar eu agradeço.
Meu Paulo

Meu Paulo

Curtidas 0

Melhor post

Ronaldo Lanhellas

Ronaldo Lanhellas

05/07/2014

Tente alterar o cliente.executeUpdate(); para cliente.executeQuery();, guardando o resultado em um ResultSet. Se resolver, então você já sabe que o problema é que mesmo sendo um VOID a função está retornando um valor qualquer, depure qual esse valor.
GOSTEI 1

Mais Respostas

Meu Paulo

Meu Paulo

02/07/2014

Eu mudei o:
int result = cliente.executeUpdate();

para:
ResultSet result = cliente.executeQuery();

E coloquei um:
System.out.println(result);

e retornou isto:

org.postgresql.jdbc3g.Jdbc3gResultSet@3a88446d

Não consegui achar nada sobre isso no google.
Eu posso simplesmente ignorar esse retorno?
E aproveitando, por que deu certo usar o Query no lugar do Update?

E obrigado pela ajuda.
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

02/07/2014

Bom dia!
Quando você executa a função diretamente no PostgreSQL ocorre algum erro ou ela executa corretamente fazendo o que ela tem q fazer?
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/07/2014

Eu mudei o:
int result = cliente.executeUpdate();

para:
ResultSet result = cliente.executeQuery();

E coloquei um:
System.out.println(result);

e retornou isto:

org.postgresql.jdbc3g.Jdbc3gResultSet@3a88446d

Não consegui achar nada sobre isso no google.
Eu posso simplesmente ignorar esse retorno?
E aproveitando, por que deu certo usar o Query no lugar do Update?

E obrigado pela ajuda.


O executeUpdate não espera nenhum retorno, apenas a quantidade de linhas que foram afetadas. Quando você usa o executeQuery é esperado um retorno, e como você mesmo pode perceber ele está retornando um ResultSet. Você pode ignorar este retorno que não tem problema algum, mas se quiser pode analisar com calma que tipo de retorno é esse, o que tem dentro do objeto ResultSet que você mostrou.
GOSTEI 0
Meu Paulo

Meu Paulo

02/07/2014

Olá Marisiana.
Quando eu executo a function no postgre ele faz a inserção de dados normalmente, porém onde deveria retornar algo tipo:

Query returned successfully: one row affected, 367 ms execution time.

Retorna uma tabela (tipo a que retorna quando executa um select) com uma coluna e uma linha.
O nome da coluna é fisica_insert void e a linha 1 esta em branco.
GOSTEI 0
Ronaldo Lanhellas

Ronaldo Lanhellas

02/07/2014

Bom, tenho quase certeza que o executeUpdate não vai funcionar para "funções no postgreSQL" por conta deste problema da função sempre retornar algo, mesmo que vazio. Pode ser uma limitação, repito: PODE ser uma limitação.
GOSTEI 0
POSTAR