Java Acessando Index-by Table do Oracle

1 resposta
danieldestro

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).

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 ) {}
		}
	}
}

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.

1 Resposta

danieldestro

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

Criado 27 de março de 2006
Ultima resposta 27 de mar. de 2006
Respostas 1
Participantes 1