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.