Pessoal, andei pesquisando como executar uma procedure Oracle de dentro de uma classe Java, e fiquei com dúvidas entre duas maneiras. Qual a diferença entre elas:
Maneira 1
CallableStatement cs;
cs = conn.prepareCall("{call PRC_PLP_CALCULAR(?)}");
cs.setString(1, parametro);
cs.execute();
Maneira 2
conn = DAOConexao.getConnection();
sql = conn.prepareStatement
("BEGIN " +
" PRC_PLP_CALCULAR(?); " +
"END;");
sql.setString(1, parametro);
sql.execute();
sql.close();
Valew.
Cara, use a primeira.
Até onde eu sei, ela funciona em mais de um banco, não só no oracle, ao contrário da segunda.
[]'s
Cara realmente acho que a primeira é uma forma de se trabalhar com bancos diferentes…
uma coisa interessante que o amigo poderia contribuir… como trazer erros da proc para o JAVA… ja vi sistemas que não trata corretamente… e o sistema executa a proc e se der erro nao retorna nada… e o sistema continua seu processo normalmente.
Uma das maneiras de testar se deu erro é criar um parâmetro OUT que conterá a mensagem de erro. Ao executar no java verifica-se se esse parêmetro é diferente de null, se for, exibir a mensagem.
[quote=julianostr]Uma das maneiras de testar se deu erro é criar um parâmetro OUT que conterá a mensagem de erro. Ao executar no java verifica-se se esse parêmetro é diferente de null, se for, exibir a mensagem.
[/quote]
Cara teria como vc mostrar um exemplo?, ~porque acho que meu algoritimo que executa uma determinada procedure no banco esta cagando em algo…
como poderia implementar esse “pega erro”, tenho pouco conhecimento em oracle.
vlw irmão.
Procedure de banco Oracle:
procedure teste(p_cod_empresa IN number, p_dsc_empresa OUT varchar2, p_dsc_erro OUT varchar2) IS
begin
p_dsc_erro:= null;
select dsc_empresa
into p_dsc_empresa
from empresa
where cod_empresa = p_cod_empresa;
exception
-- Qualquer tipo de erro de banco vai entrar aqui.
when others then
p_dsc_erro:= sqlerrm; -- Retorna a mensagem com código e descrição do erro Oracle
end;
Trecho em java para execução e tratamento do erro:
Connection conn = <sua conexão>;
CallableStatement ctsmt = conn.prepareCall("{call teste(?,?,?)}");
ctsmt.setInt(1, 100);
ctsmt.registerOutParameter(2, Types.VARCHAR);
ctsmt.registerOutParameter(3, Types.VARCHAR);
ctsmt.execute();
// Se o parâmetro OUT p_dsc_erro retornar diferente de null, exibe mensagem de erro
if (ctsmt.getString(3) != null) {
throw new Exception(ctsmt.getString(3));
}