Pessoal preciso de ajuda pra executar Stored Procedures do Oracle em um programa feito em Java
Tentei peskisar na web mas só acho como fazer uma StoredProcedure no Oracle usando Java.
Ajudem-me, por favror : :roll:
Pessoal preciso de ajuda pra executar Stored Procedures do Oracle em um programa feito em Java
Tentei peskisar na web mas só acho como fazer uma StoredProcedure no Oracle usando Java.
Ajudem-me, por favror : :roll:
Pra uma procedure:
CallableStatement ctsmt = <sua_conexão>.prepareCall("{call procedure_oracle(?,?,?,?)}");
ctsmt.setString(1, "A");
ctsmt.setString(2, "S");
ctsmt.setString(3, "N");
ctsmt.setString(4, "N");
ctsmt.execute();
ctsmt.close();
Pra uma function
CallableStatement ctsmt = <sua_conexão>.prepareCall("{? = call function_oracle(?,?,?,?)}");
ctsmt.registerOutParameter(1, Types.VARCHAR);
ctsmt.setString(2, "A");
ctsmt.setString(3, "B");
ctsmt.setString(4, "N");
ctsmt.setString(5, "SEILA");
ctsmt.execute();
String retorno = ctsmt.getString(1);
ctsmt.close();
juliano,
Vo precisar muito disso cara… minha aplicacao vai xamar uma pancada de procedures de um banco oracle remoto, entao tava qurendo saber como eu faço pra por exemplo executar uma consulta (q vai ser uma function do banco), e como vou obter o retorno… ja li e vi q nao retorna ‘magicamente’ um resultSet, q tenho q trabalhar com cursores e tal…
pode me indicar um tutorial onde posso aprender sobre isso? procedures e functions do banco oracle sendo xamadas de dentro da minha aplicacao java?
Brother, estou te mandando um exemplo, expero que te ajude.
No exemplo abaixo é executada um procedure no Oracle com 3 parametros de entrada e dois de saída. Vem um conjunto de registros e uma String.
import java.net.URL;
import java.sql.*;
import java.util.*;
import oracle.jdbc.driver.*;
import oracle.sql.CHAR;
import java.io.*;
import javax.servlet.http.HttpSession;
...
...
...
// Conectar no BD criando conexaum chamada conn
...
...
...
OracleCallableStatement cstmt= null;
ResultSet cursor = null;
try {
String strSPMsgErro = null;
cstmt = (OracleCallableStatement) conn.prepareCall
("begin NOMEpackage.NomeProcedure(:1,:2,:3,:4, :5); end;");
cstmt.setString(1, "blabla");
cstmt.setString(2, "bla");
cstmt.setString(3, "bluh");
cstmt.registerOutParameter (4, OracleTypes.CURSOR);
cstmt.registerOutParameter (5, java.sql.Types.VARCHAR);
cstmt.execute ();
//Nesta vaiavel me o programador Oracle me informa se ocorreu alguma exception durante a execução da procedure no oracle:
strSPMsgErro = ((OracleCallableStatement)cstmt).getString (5);
if(strSPMsgErro==null) {
cursor = ((OracleCallableStatement)cstmt).getCursor (4);
}
if (strSPMsgErro!=null) {
//Tratar Erro
}
}catch(Exception e){
//Tratar Erro
}
/*---Fim - Executar SPR ------------------------------------------------*/
/*---Inicio - Gravar Vo ------------------------------------------------*/
try {
//Vou dar um exemplo passando os dados do resulset pra uma collection do tipo Map depois eu fecho o resultset utilzando metodos da classe BoBDFunctions
Map map = null;
//Use the cursor like a normal ResultSet
if (cursor!=null) {
map = new TreeMap();
while (cursor.next()) {
String tempCod = cursor.getString("CGC_CPF");
String tempCodNome = cursor.getString("NOME_CREDOR");
tempCodNome = tempCod +" - " + tempCodNome;
map.put(tempCod , tempCodNome);
}
}
oVo.setOutMap(map);
}catch(Exception e){
//Tratar Erro
}finally{
try {
BoBDFunctions.closeResultSet(cursor);
BoBDFunctions.closeStatement(cstmt);
BoBDFunctions.closeConnection(conn);
}catch(Exception e) {
//Tratar Erro
}
}
/*---Fim - Gravar Vo ---------------------------------------------------*/
////////////////////////////////////////////////////
///////////////////////////////////////////////////
// metodos da classe BoBDFunctions:
public static synchronized void closeResultSet(ResultSet rs) throws Exception {
try {
if (rs != null)
rs.close();
}catch(SQLException e) {
//e.printStackTrace();
//BoAttmFunctions.logar("c:\\pastaS\\ERRO_Close_"+System.currentTimeMillis()+".txt","Erro ao close:"+e.getMessage());
}catch (Exception e) {
//e.printStackTrace();
//BoAttmFunctions.logar("c:\\pastaS\\ERRO_Close_"+System.currentTimeMillis()+".txt","Erro ao close:"+e.getMessage());
}
}//end metodo
/**
* Método que Fecha um Statement
* @param stmt Statement que será fechado
*/
public static synchronized void closeStatement( Statement stmt) throws Exception {
try {
if (stmt != null)
stmt.close();
}catch(SQLException e) {
//Tratar Erro
}catch (Exception e) {
//Tratar Erro
}
}//end metodo
/**
* Método que Fecha uma Connection
* @param conn Connection que será fechada
*/
public static synchronized void closeConnection( Connection conn) throws Exception {
try {
if (conn != null)
conn.close();
}catch(SQLException e) {
//Tratar Erro
}catch (Exception e) {
//Tratar Erro
}
}//end metodo
/**
* Método que fornece uma Connection (Conexão com a Base de Dados)
* @param pstrCon String de Conexão EX: jdbc:oracle:thin:@172.XX.XX.XX:numPORTA:NOMEbd
* @param pstrUsuario Usuário de Banco de Dados para fazer a Conexão
* @param pstrSenha Senha do Usuário de Banco de Dados para fazer a Conexão
*/
public static synchronized Connection getConnection(String pstrCon,String pstrUsuario,String pstrSenha)throws Exception {
Connection conn = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
conn = (OracleConnection)
DriverManager.getConnection(pstrCon, pstrUsuario, pstrSenha);
return conn;
}catch(Exception e) {
//Tratar Erro
}
}//end metodo
E possível executar este seu exemplo sem utilizar as classes Oracle, somente as que estão no Java?