Fórum Problemas com Function Postgre / JAVA #484344

02/07/2014

0

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

Responder

Post mais votado

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.

Ronaldo Lanhellas

Ronaldo Lanhellas
Responder

Gostei + 1

Mais Posts

07/07/2014

Meu Paulo

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.
Responder

Gostei + 0

08/07/2014

Marisiana Battistella

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?
Responder

Gostei + 0

08/07/2014

Ronaldo Lanhellas

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.
Responder

Gostei + 0

08/07/2014

Meu Paulo

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.
Responder

Gostei + 0

09/07/2014

Ronaldo Lanhellas

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.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar