Problemas com Function Postgre / JAVA
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.
| |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
Curtidas 0
Melhor post
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
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.
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
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?
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
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.
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
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.
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
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