Java Acessando Index-by Table do Oracle

Esses dias precisei acessar uma tal de “index-by table” de uma procedure do Oracle. Uma loucura!

Por curiosidade, quem precisar um dia, está registrado aqui.

Este procedure recebe dois parâmetros IN (long/number e string/varchar2) e tem dois argumentos OUT (index-by table - number varchar).

[code]package seu.pacote;

import java.sql.;
import java.util.
;

import oracle.jdbc.OracleTypes;
import oracle.jdbc.driver.OracleCallableStatement;

public class SuaClasse {
public SuaClasse(){
}

public void consulta(Long id, String nome ) {
	DAO dao = DAO.getInstance();
	Connection conn = dao.getConnection();
	OracleCallableStatement st = null;
	final String CALL_PROC = "{call SUA_PACKAGE.SUA_PROCEDURE(?,?,?,?)}";
	
	try {
		st = (OracleCallableStatement) conn.prepareCall( CALL_PROC );
		
		if( id != null ) {
			st.setLong(1, if.longValue() );
		} else {
			st.setNull( 1, Types.NUMERIC );
		}
		if( nome != null ) {
			st.setLong( 2, nome );
		} else {
			st.setNull( 2, Types.VARCHAR );
		}
		
		final int MAXLEN = 1000;
		final int MAXLENSTR = 200;
		
		st.registerIndexTableOutParameter(3, MAXLEN, OracleTypes.NUMBER, 0);
		
		st.registerIndexTableOutParameter(4, MAXLEN, OracleTypes.VARCHAR, MAXLENSTR);
		
		st.execute();
		
		long[] numPeriodo = (long[]) st.getPlsqlIndexTable(3, Long.TYPE);
		String[] codEvento = (String[]) st.getPlsqlIndexTable(4);

	} catch (SQLException e) {
		throw new RuntimeException(e);
	} finally {
		if( st != null ) try { st.close(); } catch( Exception e ) {}
		if( conn != null ) try { conn.close(); } catch( Exception e ) {}
	}
}

}[/code]

Isso, no meu projeto, não rolou no JBoss 3.2.3, pois o container gerencia os Statements e Resultsets e o tipo é diferente do que eu quero ali. Tive de mudar a PL/SQL para cursor Oracle e funcionou.

Mas, de qualquer forma, o código acima funciona num ambiente não gerenciado.

Mais info: http://www.oracle.com/technology/sample_code/tech/java/sqlj_jdbc/files/oracle10g/plsqltables/Readme.html