Access Keys:
Skip to content (Access Key - 0)
 
Stored Procedure

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()));&nbsp;&nbsp;
;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()));&nbsp;&nbsp;
proc.setString(7, String.valueOf(i.getRtUFOrigem()));
proc.setString(8, String.valueOf(i.getRtCidDestino()));
proc.setString(9, String.valueOf(i.getRtUFDestino()));&nbsp;&nbsp;
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.

Adaptavist Theme Builder (3.1.4) Powered by Atlassian Confluence, the Enterprise Wiki. (Version: 2.5.4 Build:#809 Jun 12, 2007)
Free theme builder license