Boa tarde galera,
Estou tentando dividir o processamento entre o banco de dados e a aplicação utilizando procedures, entretanto, quando rodo a procedure do banco, ele realmente faz a ação, mas rodando a procedure da aplicação, ele não efetiva o comando. Segue os códigos:
STP:
DROP PROCEDURE IF EXISTS sgcozinha.STP_DELETE_EMPRESA;
CREATE PROCEDURE STP_DELETE_EMPRESA(v_NomeEmpresa VARCHAR(35), v_Cnpj CHAR(14))
BEGIN
DELETE FROM empresa WHERE NOMEEMPRESA = v_NomeEmpresa AND CNPJ = v_Cnpj;
IF((SELECT COUNT(*) FROM empresa WHERE CNPJ = v_Cnpj) <> 0) THEN
SELECT 'Não foi possível excluir empresa!' AS Msg;
ELSE SELECT 'Empresa excluída com sucesso!' AS Msg;
END IF;
END;
DAO
public String excluirEmpresa(Empresa empresa) {
String sql = "CALL STP_DELETE_EMPRESA(?,?)";
String msg = new String();
try {
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, empresa.getIdEmpresa());
stmt.setString(2, empresa.getNomeEmpresa());
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
msg = rs.getString("MSG");
}
rs.close();
stmt.close();
return msg;
} catch (SQLException e) {
return "ERRO AO CONECTAR COM O BANCO DE DADOS";
// throw new RuntimeException(e);
}
}
Alguém pode me ajudar?
Não funciona por que você está usando PreparedStatement
PreparedStatement stmt = connection.prepareStatement(sql);
Para chamar procedimentos armazenados (stored procedures) você deve usar um objeto de CallableStatement (java.sql.CallableStatement).
[quote=drsmachado]Não funciona por que você está usando PreparedStatement
PreparedStatement stmt = connection.prepareStatement(sql);
Para chamar procedimentos armazenados (stored procedures) você deve usar um objeto de CallableStatement (java.sql.CallableStatement).[/quote]
Mesmo alterando ainda não funciona.
public String excluirEmpresa(Empresa empresa) {
String sql = "CALL STP_DELETE_EMPRESA(?)";
String msg = new String();
try {
//PreparedStatement stmt = connection.prepareStatement(sql);
CallableStatement stmt = connection.prepareCall(sql);
stmt.setString(1, empresa.getIdEmpresa());
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
msg = rs.getString("MSG");
}
rs.close();
stmt.close();
return msg;
} catch (SQLException e) {
System.out.println(e);
return "ERRO AO CONECTAR COM O BANCO DE DADOS";
// throw new RuntimeException(e);
}
}
Não funciona = ???
O que não funciona é dizer que não funciona. Não tenho bola de cristal, não jogo búzios, tarô, runas ou qualquer outro método de adivinhação, então, sem dizer o que acontece, fica difícil.
[quote=drsmachado]Não funciona = ???
O que não funciona é dizer que não funciona. Não tenho bola de cristal, não jogo búzios, tarô, runas ou qualquer outro método de adivinhação, então, sem dizer o que acontece, fica difícil.[/quote]
Não funciona quer dizer que as linhas de comando são executadas, entretanto, as ações não são efetivadas no banco, ou seja, não aparece nenhuma exception e o banco de dados não é alterado.
[quote=drsmachado]Não sei como está a SP, mas talvez isso possa ajudar.
http://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/[/quote]
Segue as procedures:
DROP PROCEDURE IF EXISTS sgcozinha.STP_DELETE_EMPRESA;
DELIMITER $$
CREATE PROCEDURE STP_DELETE_EMPRESA(v_IdEmpresa INT)
BEGIN
DELETE FROM empresa WHERE IDEMPRESA = v_IdEmpresa;
IF((SELECT COUNT(*) FROM empresa WHERE IDEMPRESA = v_IdEmpresa) <> 0) THEN
SELECT 'Não foi possível excluir empresa!' AS Msg;
ELSE SELECT 'Empresa excluída com sucesso!' AS Msg;
END IF;
END $$
DELIMITER ;
DROP PROCEDURE IF EXISTS sgcozinha.STP_INSERT_EMPRESA;
DELIMITER $$
CREATE PROCEDURE STP_INSERT_EMPRESA(v_NomeEmpresa VARCHAR(35), v_Cnpj CHAR(14))
BEGIN
IF((SELECT COUNT(*) FROM empresa WHERE CNPJ = v_Cnpj) = 0) THEN
INSERT INTO empresa(NOMEEMPRESA, CNPJ) VALUES(v_NomeEmpresa, v_Cnpj);
SELECT 'Empresa cadastrada com sucesso!!' AS Msg;
ELSE SELECT 'Ja existe um registro com esse CNPJ!' AS Msg;
END IF;
END $$
DELIMITER ;
DROP PROCEDURE IF EXISTS sgcozinha.STP_UPDATE_EMPRESA;
DELIMITER $$
CREATE PROCEDURE STP_UPDATE_EMPRESA(v_IdEmpresa INT, v_NomeEmpresa VARCHAR(35), v_Cnpj CHAR(14))
BEGIN
IF((SELECT COUNT(*) FROM empresa WHERE CNPJ = v_Cnpj) <> 0) THEN
UPDATE empresa SET NOMEEMPRESA = v_NomeEmpresa AND CNPJ = v_Cnpj WHERE IDEMPRESA = v_IdEmpresa;
SELECT 'Empresa alterada com sucesso!!' AS Msg;
ELSE SELECT 'Registro não encontrado!' AS Msg;
END IF;
END $$
DELIMITER ;
DROP PROCEDURE IF EXISTS sgcozinha.STP_SELECT_EMPRESA;
DELIMITER $$
CREATE PROCEDURE STP_SELECT_EMPRESA()
BEGIN
SELECT * FROM empresa ORDER BY nomeempresa;
END $$
DELIMITER ;
Pelo que vi, não devo usar ResultSet e sim pegar as Strings direto.
Não consegui montar essas procedures passando parametros IN/OUT, dava erro quando ia gravar no banco.