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]);