Olá Amigos do Sou Java, Hoje vou demonstrar como usar efetuar uma chamada a uma Stored Procedure. Fiz este artigo pois não encontrei nenhum artigo em português para me ajudar quando precisei, eu espero que seja útil a todos vocês e fiquem a vontade para me escrever caso fiquem com duvidas.
Primeiramente vamos criar um DAO com um metodo para efetuar a chamada e verificar a resposta do servidor:
Obtemos uma referencia valida a session do Hibernate. (Session session = getSession(); )
Criamos o objeto de Connection (Connection con = null; )
Criamos o objeto CallableStatement (CallableStatement proc = null; )
Obtemos uma referencia valida a org.hibernate.session.connection (con = session.connection(); )
Com o objeto connection inicializado criamos a chamada para a Stored Procedure no banco de dados.
proc = con.prepareCall("execute GRAVAVIAGEM ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ");
A quantidade de ( ? ) esta relacionada diretamente com a chamada original da Stored Procedure e seus argumentos originais em sequencia.
Existem duas maneiras de setar parametros na procedure:
1. proc.setString(1, String.valueOf(lst.getCodigo())); (a primeira maneira é mais rustica e precisa de uma conversao manual de String.valueOf(); )
2. proc.setObject(1, lst.getCodigo() , Types.VARCHAR); (a segunda maneira é deixar o java.sql.Types fazer a conversao).
Em seguida enviamos o comando ( proc.execute(); ) para executar a chamada e commitamos a operacao com nosso objeto de connection ( con.commit(); )
public class OperacaoViagemDAO {
@SuppressWarnings("deprecation")
public void iniciarViagem(OperacaoViagem lst) throws Exception {
Session session = getSession();
Connection con = null;
CallableStatement proc = null;
try {
con = session.connection();
proc = con.prepareCall("execute GRAVAVIAGEM ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ");
proc.setString(1, String.valueOf(lst.getCodigo()));
proc.setString(2, String.valueOf(lst.getFilial()));
proc.setString(3, String.valueOf(lst.getTipo()));
proc.setString(4, String.valueOf(lst.getDtInicio()));
proc.setString(5, String.valueOf(lst.getCodRota() == null ? 1 : lst.getCodRota()));
proc.setString(6, String.valueOf(lst.getRtCidOrigem()));
proc.setString(7, String.valueOf(lst.getRtUFOrigem()));
proc.setString(8, String.valueOf(lst.getRtCidDestino()));
proc.setString(9, String.valueOf(lst.getRtUFDestino()));
proc.setString(10, String.valueOf(lst.getRtTempoHora()));
proc.setString(11, String.valueOf(lst.getRtDistancia()));
proc.setString(12, String.valueOf(lst.getPlaca1()));
proc.setString(13, String.valueOf(lst.getPlaca2()));
proc.setString(14, String.valueOf(lst.getCpfMotorista()));
proc.setString(15, String.valueOf(lst.getMotorista()));
proc.setString(16, String.valueOf(lst.getCodTipoDesloc()));
proc.setString(17, String.valueOf(lst.getTipoFrota()));
proc.execute();
con.commit();
} catch (Exception e) {
e.printStackTrace();
throw new PlcException("jcompany.erro.generico", new Object\[\] { "iniciarViagem", e }, e, log);
}
}
}
Test Case:
Classe sem TestCase não prova nada e não pode entrar em Produção, por isso criei dois metodos para testar:
O primeiro metodo faz basicamente a operacao do DAO:
@SuppressWarnings("deprecation"){color}
public void testeGravarViagemProc(List<OperacaoViagem> lst) throws Exception {
Session session = getSession();
Connection con = null;
CallableStatement proc = null;
try {
con = session.connection();
proc = con.prepareCall("execute GRAVAVIAGEM ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,? ");
for(OperacaoViagem i: lst){
proc.setString(1, String.valueOf(i.getCodigo()));
proc.setString(2, String.valueOf(i.getFilial()));
proc.setString(3, String.valueOf(i.getTipo()));
;proc.setString(4, String.valueOf(i.getDtInicio()));
proc.setString(5, String.valueOf(i.getCodRota() == null ? 1 : i.getCodRota()));
proc.setString(6, String.valueOf(i.getRtCidOrigem()));
proc.setString(7, String.valueOf(i.getRtUFOrigem()));
proc.setString(8, String.valueOf(i.getRtCidDestino()));
proc.setString(9, String.valueOf(i.getRtUFDestino()));
proc.setString(10, String.valueOf(i.getRtTempoHora()));
proc.setString(11, String.valueOf(i.getRtDistancia()));
proc.setString(12, String.valueOf(i.getPlaca1()));
proc.setString(13, String.valueOf(i.getPlaca2()));
proc.setString(14, String.valueOf(i.getCpfMotorista()));
proc.setString(15, String.valueOf(i.getMotorista()));
proc.setString(16, String.valueOf(i.getCodTipoDesloc()));
proc.setString(17, String.valueOf(i.getTipoFrota()));
break;
}
boolean executou = proc.execute();
con.commit();{color}
System.out.println(!executou);
} catch (Exception e) {
e.printStackTrace();
}
}
O segundo metodo testa a procedure original:
@SuppressWarnings("deprecation")
public void testeCallableStatement() throws PlcException, SQLException {
Session session = getSession();
Connection con = null;
CallableStatement proc = null;
try {
con = session.connection();
proc = con.prepareCall("execute GRAVAVIAGEM '273', '65', 'E', '2007-07-23 17:54:30.0', '46', 'CURITIBA', 'PR', 'GUARULHOS', 'SP', '10', '435', 'XXX1010', 'XXX1020', '79044050915', 'PAULINHO CAMARA MONTEIRO', '1', 'F' ");
boolean executou = proc.execute();
con.commit();
System.out.println(executou);
}catch (Exception e) {
e.printStackTrace();
} finally {
try {
proc.close();
} catch (SQLException e) {
}
con.close();
}
}
Agradecimentos:
George Gastaldi - Chief Software Architect at Elosoft S.A. Todos que leram até aqui, e espero tenha sido útil.
Autor:
Thomas Rafael Modeneis - Sun Certified Programmer for Java Platform, SE 5.0 - 310-055. at Elosoft S.A. thomas.modeneis@linuxmail.org
Equipe Sou Java, Fortalecendo a comunidade de usuários de Java do Brasil.
|
|