Stored Procedure com JDBC

7 respostas
felipecaparelli

Já vi alguns tópicos pela net a respeito desse caso, porém, até agora nenhum funcionou para o meu caso. Segue o código e após o stack trace:

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Types;

public class HerancaTeste {

 public static boolean verificaHeranca(Integer idSistema) {

	CallableStatement callableStatement = null;
	int resp = 0;

      try {
	Class.forName("oracle.jdbc.driver.OracleDriver");
	Connection con = DriverManager.getConnection("jdbc:oracle:thin:@10.11.40.92:1521:XXX", "user", "senha");
	callableStatement = con.prepareCall(" { call sp_teste_buxiro(?,?) } ");
			
	callableStatement.setInt(1, idClasse.intValue());

	//Prepara as variaveis de retorno da procedure.
	callableStatement.registerOutParameter(2, Types.NUMERIC, 2);
	callableStatement.registerOutParameter(3, Types.NUMERIC, 2);
	callableStatement.registerOutParameter(4, Types.NUMERIC, 2);
	callableStatement.registerOutParameter(5, Types.NUMERIC, 2);
	callableStatement.registerOutParameter(6, Types.NUMERIC, 2);
	callableStatement.registerOutParameter(7, Types.NUMERIC, 2);
	callableStatement.registerOutParameter(8, Types.INTEGER);			
		
	callableStatement.execute();

	resp = callableStatement.getInt(2);

	callableStatement.close();

	return (resp == 1 ? true : false);

      } catch (SQLException e) {

	e.printStackTrace();

      } catch (ClassNotFoundException e) {

	e.printStackTrace();

      }

    }

}

Stacktrace:

Exception in thread "main" java.lang.NullPointerException at oracle.jdbc.ttc7.TTCAdapter.newTTCType(TTCAdapter.java:270) at oracle.jdbc.ttc7.TTCAdapter.createNonPlsqlTTCColumnArray(TTCAdapter.java:256) at oracle.jdbc.ttc7.TTCAdapter.createNonPlsqlTTCDataSet(TTCAdapter.java:231) at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1412) at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:862) at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1839) at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1764) at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2354) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:421) at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:486) at HerancaTeste.verificaHeranca(HerancaTeste.java:30) at Conectiva.main(Conectiva.java:5)

7 Respostas

X

vc colocou 2 parametros e setou apenas 1, pode ser isso:

callableStatement = con.prepareCall(" { call sp_teste_buxiro(?,?) } "); //cada ? é um parâmetro
               
callableStatement.setInt(1, idClasse.intValue());  //setou o primeiro

                                                                            //e o segundo?
rafaelglauber

Oi,

Tentou na busca do forum? Temos essa thread aqui que vai te ajudar.

felipecaparelli

Obrigado rafaelglauber e xxt,

um colega conseguiu resolver o problema. Vou ver com ele e posto em seguida, caso não seja uma das opções citadas. Eu só esqueci de colocar ai as interrogações de cada paramêtro, mas não eram esses os problemas.

Obrigado.

felipecaparelli

Olá pessoal,

eu havia dito que meu colega conseguiu resolver, mas não deu certo aqui para mim ainda não.

O que ele havia feito e resultou em sucesso lá foi remover as chaves “{” e “}” da chamada (" { call procedure… } "), mas isso não bastou para funcionar.

Agora o erro que aparece é o de quantidade de parâmetros inválidos, porém conferi a procedure e são 8 mesmo, sendo um de entrada e 7 de saída.

:?: Alguém ai consegue testar este modelo, com alguma procedure de mais de 2 parametros (IN/OUT) e ver no que resulta?

Obs.: estou colocando o tipo oracle.jdbc.OracleTypes.INTEGER para todos os parametros de saída no registerOutParameter(…), exceto o último que é do tipo BI (0 e 1). Isto pode estar interferindo em algo? :roll:

Desde já agradeço a atenção de todos!

fabim

Bom… posta de novo ai pq nao entendi. Vc declarou 2 parametros (?), mas setou 8?

felipecaparelli
import java.sql.CallableStatement;   
import java.sql.Connection;   
import java.sql.DriverManager;   
import java.sql.SQLException;   
import java.sql.Types;   
  
public class HerancaTeste {   
  
public static boolean verificaHeranca(Integer idSistema) {   
  
    CallableStatement callableStatement = null;   
    int resp = 0;   
  
      try {   
    Class.forName("oracle.jdbc.driver.OracleDriver");   
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@10.11.40.92:1521:XXX", "user", "senha");   
    callableStatement = con.prepareCall(" { call sp_teste_buxiro(?,?,?,?,?,?,?,?) } ");   
               
    callableStatement.setInt(1, idClasse.intValue());   //1 - IN: Entrada
  
    //Prepara as variaveis de retorno da procedure.   
    callableStatement.registerOutParameter(2, Types.NUMERIC, 2);     //2 - OUT: Saida
    callableStatement.registerOutParameter(3, Types.NUMERIC, 2);     //3 - OUT: Saida
    callableStatement.registerOutParameter(4, Types.NUMERIC, 2);     //4 - OUT: Saida
    callableStatement.registerOutParameter(5, Types.NUMERIC, 2);     //5 - OUT: Saida
    callableStatement.registerOutParameter(6, Types.NUMERIC, 2);     //6 - OUT: Saida
    callableStatement.registerOutParameter(7, Types.NUMERIC, 2);    //7 - OUT: Saida
    callableStatement.registerOutParameter(8, Types.INTEGER);        //8 - OUT: Saida
           
    callableStatement.execute();   
  
    resp = callableStatement.getInt(2);   
  
    callableStatement.close();   
  
    return (resp == 1 ? true : false);   
  
      } catch (SQLException e) {   
  
    e.printStackTrace();   
  
      } catch (ClassNotFoundException e) {   
  
    e.printStackTrace();   
  
      }   
  
    }   
  
}

StrackTrace

Exception in thread "main" java.lang.NullPointerException   
    at oracle.jdbc.ttc7.TTCAdapter.newTTCType(TTCAdapter.java:270)   
    at oracle.jdbc.ttc7.TTCAdapter.createNonPlsqlTTCColumnArray(TTCAdapter.java:256)   
    at oracle.jdbc.ttc7.TTCAdapter.createNonPlsqlTTCDataSet(TTCAdapter.java:231)   
    at oracle.jdbc.ttc7.TTC7Protocol.doOall7(TTC7Protocol.java:1412)   
    at oracle.jdbc.ttc7.TTC7Protocol.parseExecuteFetch(TTC7Protocol.java:862)   
    at oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1839)   
    at oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1764)   
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:2354)   
    at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:421)   
    at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:486)   
    at HerancaTeste.verificaHeranca(HerancaTeste.java:30)   
    at Conectiva.main(Conectiva.java:5)
felipecaparelli

Olá pessoal,

Resolvido o caso. O problema é incompatibilidade de versão entre nossa procedure e a versão do Banco (Oracle 8). A versão que estamos trabalhando aqui não tem o tipo BOOLEAN, porém, em versões mais atuais isso já foi solucionado.
Entretanto modificamos nossas libs para fazer funcionar de acordo com a versão do banco que temos.

Caso alguém tenha este problema, verifique o tipo utilizado nos parametros da procedure e compatibilidade de versões do Banco e os drivers do Oracle.

Obrigado a todos.

Criado 29 de julho de 2008
Ultima resposta 30 de jul. de 2008
Respostas 7
Participantes 4