InvalidType: Buscando um STRUCT do Oracle

Srs,

Estou testando o uso do STRUCT do Oracle e estou com problemas.

Criei algo parecido com isto:

Create Type Pessoa as Object(
   nome varchar2(30),
   telefone varchar(30)
);

Create Type VariasPessoas as Object(
     presidente Pessoa,
     diretor  Pessoa,
     gerente Pessoa
);

E fiz uma procedure para me retornar a estrutura com a seguinte assinatura:

retornaStruct(org OUT VariasPessoas)

E estou tentando buscar isso via JDBC desse jeito:

cstmt =	conn.prepareCall("{call TESTE_STRUCT.teste(?) } ");
cstmt.registerOutParameter(1,Types.STRUCT);

O problema e que ele dá erro na linha de registro do parametro:

java.sql.SQLException: Conflito de Tipo de Parâmetro: sqlType=2002

Alguma dica?

Tente utilizar o tipo STRUCT da classe oracle.jdbc.driver.OracleTypes e olhe se dá certo…

Mesmo usando oracle.jdbc.driver.OracleTypes dá o mesmo erro.

Embora parte do problema já tenha sido resolvido gostaria de deixar duas boas referencias para a utilização de parâmetros de saída e tipos complexos junto ao Oracle…

:arrow: http://www.stanford.edu/dept/itss/docs/oracle/9i/java.920/a96654/oraoot.htm
:arrow: http://www.stanford.edu/dept/itss/docs/oracle/9i/java.920/a96654/oraint.htm

Rodrigo,
Para que não ocorra esse erro acima vc deve especificar a qual tipo ele se refere no banco que vc está acessando.

Para isso utilize o método sobrecarregado registerOutParameter(int, int, String) de CallableStatement…
No terceiro parâmetro vc especifica o tipo dele na base de dados…As vezes é necessário informar o schema do tipo…

Eu fiz esse pequeno teste aquih e deu certo…

Implementei aquih um Struct em meu banco com a simples e seguinte estrutura:

TYPE   MEU_TIPO AS OBJECT (
 MENSAGEM VARCHAR2(255)
);

Após isso, criei uma procedure que tem um parâmetro de retorno, com o tipo criado anteriormente:

PROCEDURE teste(meuObjeto OUT MEU_TIPO)
IS
BEGIN
   meuObjeto := MEU_TIPO('TESTANDO....');
END;

E em minha classe de teste fiz:


	Connection conn = ...;//Obtenho minha conexao...
	CallableStatement cs = 
	  (CallableStatement) conn.prepareCall("{ call meuSchema.meuPacote.teste(?)}");

	cs.registerOutParameter(1, Types.STRUCT,  "meuSchema.MEU_TIPO");  
	cs.execute();
		
	STRUCT meuObjeto = (STRUCT)cs.getObject(1);
	Object[] attr = meuObjeto.getAttributes();
	System.out.println("MENSAGEM: " + attr[0]);

Valeu Cara!!!