Como chamar uma procedure com saida de um array

3 respostas
java
E

Olá gostaria de saber como fazer para chamar uma procedure que tem como saída um array.

tenho a seguinte procedure

CREATE OR REPLACE PROCEDURE sp_erros_processo(p_cod_erro OUT NUMBER,
                                              p_erros    OUT tab_tipo_erro) AS

  v_idx_erro NUMBER := 1;

BEGIN
  p_erros := tab_tipo_erro();

  --simular carga do array com os erros
  FOR i_rg_erros IN 1 .. 50 LOOP
    p_erros.extend;
    p_erros(v_idx_erro) := obj_tipo_erro('[ ERRO ] - ' || v_idx_erro,
                                         '[ ERRO ] - ' || v_idx_erro);

    --variavel para controlar o indice do array  
    v_idx_erro := v_idx_erro + 1;
  END LOOP;

  p_cod_erro := 0;

EXCEPTION
  WHEN OTHERS THEN
    p_cod_erro := 2;
    p_erros.extend;
    p_erros(v_idx_erro + 1) := obj_tipo_erro('[ ERRO ] - ' || v_idx_erro,
                                             '[ ERRO ] - ' || v_idx_erro);
  
END sp_erros_processo;

e estou chamando no Java da Seguinte forma ;

import java.sql.Connection;
import java.sql.SQLException;

import oracle.jdbc.internal.OracleCallableStatement;
import oracle.jdbc.internal.OracleTypes;

public class ChamarPackTeste {
	private Connection minhaConnection;

	public ChamarPackTeste(Connection minhaConnection ) {
		this.minhaConnection = minhaConnection;
	}
	
	public void chamarPack() throws SQLException {
		String pacErros = "{ begin CALL sp_erros_processo(?, ?); end}";
		
		OracleCallableStatement procedure = (OracleCallableStatement) minhaConnection.prepareCall(pacErros);
		procedure.registerOutParameter(1, OracleTypes.NUMBER);
		procedure.registerOutParameter(2, OracleTypes.ARRAY ,"tab_tipo_erro" );
		
		
		procedure.execute();
		
		
		System.out.println(procedure.getInt(1));
		System.out.println(procedure.getInt(2));
	
	}
	
	public static void main(String[] args) throws SQLException {
		Connection conexao = new ConexaoFactory().obterConexaoHomologacao();
		new ChamarPackTeste(conexao).chamarPack();
	}
}

porém quando chamo ocorre o erro

Exception in thread main java.sql.SQLException: padrão de nome inválido: tab_tipo_erro

at oracle.jdbc.oracore.OracleTypeADT.initMetadata12(OracleTypeADT.java:580)

at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:507)

at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:469)

at oracle.sql.ArrayDescriptor.initPickler(ArrayDescriptor.java:1737)

at oracle.sql.ArrayDescriptor.(ArrayDescriptor.java:250)

at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:120)

at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:74)

at oracle.jdbc.driver.NamedTypeAccessor.otypeFromName(NamedTypeAccessor.java:81)

at oracle.jdbc.driver.TypeAccessor.initMetadata(TypeAccessor.java:74)

at oracle.jdbc.driver.T4CCallableStatement.allocateAccessor(T4CCallableStatement.java:614)

at oracle.jdbc.driver.OracleCallableStatement.registerOutParameterInternal(OracleCallableStatement.java:192)

at oracle.jdbc.driver.OracleCallableStatement.registerOutParameter(OracleCallableStatement.java:236)

at oracle.jdbc.driver.OracleCallableStatementWrapper.registerOutParameter(OracleCallableStatementWrapper.java:1619)

at br.com.atlantic.solutions.dao.ChamarPackTeste.chamarPack(ChamarPackTeste.java:21)

at br.com.atlantic.solutions.dao.ChamarPackTeste.main(ChamarPackTeste.java:34)

3 Respostas

D

Primeiro resultado de uma busca no google me retornou isso

E

então mas pelo que eu vi esse exemplo é de entrada eu precisava de um exemplo onde a saída é um array ou uma collections de objeto

E

Pessoal consegui a solução

public void chamarPack2() throws SQLException {
String pacErros = “{CALL sp_erros_processo(?, ?)}”;

OracleCallableStatement procedure = (OracleCallableStatement) minhaConnection.prepareCall(pacErros);
		procedure.registerOutParameter(1, OracleTypes.NUMBER);
		procedure.registerOutParameter(2, OracleTypes.ARRAY , "TAB_TIPO_ERRO");
		procedure.execute();
		
		java.sql.Array structure = procedure.getArray(2);
		
		Object[] structureArray = (Object[])structure.getArray();
		
		Object[] atributosArray = null;
		
		for (Object struct : structureArray) {
			STRUCT meuStructure = (STRUCT)struct;
			atributosArray = meuStructure.getAttributes();
			for (Object object : atributosArray) {
				System.out.println(object);
			}
			
		}
	}
Criado 9 de março de 2017
Ultima resposta 10 de mar. de 2017
Respostas 3
Participantes 2