Erro ao executar uma procedure em Java com o CallableStatemant

Não sei se estou no Fórum certo do GUJ.

Estou tendo o seguinte erro quando tento executar uma procedure em Java:

ORA-06550: linha 1, coluna 7:
PLS-00221: 'FUNC_UNIFICA_PACIENTE' não é um procedimento ou está indefinido
ORA-06550: linha 1, coluna 7:
PL/SQL: Statement ignored

Minha chamada a procedure na classe java é a seguinte:

CallableStatement callableStatement = con.prepareCall("{call SCMBA_PROD.FUNC_UNIFICA_PACIENTE(?,?,?,?)}");
callableStatement.setString(1, codigo_paciente_origem);
callableStatement.setString(2, codigo_paciente_destino);
callableStatement.setString(3, flag_exclusao);
callableStatement.setString(4, user_logado);
callableStatement.execute(); 

Alguém sabe me dizer o que poderia ser?

[]s

Bem, sua stored procedure existe? Sei que é uma pergunta idiota, mas…

Até mais!

[quote=davidbuzatto]Bem, sua stored procedure existe? Sei que é uma pergunta idiota, mas…

Até mais![/quote]

Existe sim,

é a mesma que eu executo diretamente no TOAD do ORACLE.

Pesquisando mais aqui, eu acho que sei o que é já. Na verdade eu estava mandando minha classe executar uma função e uma função espera retorno.
O que vou tentar agora é criar uma procedure que receba os parametros que preciso passar a função e ela servir de ponte e chamar a função.

Não sei se poderia ser isso, vou testar ainda.

Caso alguém saiba o motivo, post aqui por favor.

con.prepareCall("{call SCMBA_PROD.FUNC_UNIFICA_PACIENTE(?,?,?,?)}");

poderia ser substituido por:

con.prepareCall("{ ? = call SCMBA_PROD.FUNC_UNIFICA_PACIENTE(?,?,?,?)}");

callableStatement.registerOutputParameter( 1, OracleTypes.CURSOR ); // seu retorno da função

callableStatement.setLong( 2, umLongQualquer );
callableStatement.setLong( 3, umLongQualquer );
callableStatement.setString( 4, umaStringQualquer );
callableStatement.setTimestamp( 5, umTimestampQualquer );

se vc nao poe o ’ ? = ', ele entende que nao tem retorno, entao entende que é um PROCEDIMENTO. Imagino que seja isso

[quote=fabiocsi]con.prepareCall("{call SCMBA_PROD.FUNC_UNIFICA_PACIENTE(?,?,?,?)}");

poderia ser substituido por:

con.prepareCall("{ ? = call SCMBA_PROD.FUNC_UNIFICA_PACIENTE(?,?,?,?)}");

callableStatement.registerOutputParameter( 1, OracleTypes.CURSOR ); // seu retorno da função

callableStatement.setLong( 2, umLongQualquer );
callableStatement.setLong( 3, umLongQualquer );
callableStatement.setString( 4, umaStringQualquer );
callableStatement.setTimestamp( 5, umTimestampQualquer );

se vc nao poe o ’ ? = ', ele entende que nao tem retorno, entao entende que é um PROCEDIMENTO. Imagino que seja isso[/quote]

fabiocsi, amanhã quando voltar para o trabalho vou testar do modo que você citou.

Mas, a forma que eu citei no post anterior, criando uma PROCEDURE (que não tem retorno) que recebesse os parametros necessarios e servisse de ponte, repassando, para minha FUNÇÃO funcionou perfeitamente.

Vou tentar do seu modo, pois o que eu fiz foi uma meia gambiarra pra falar a verdade.

abração e obrigado pela dica.

fabiocsi

não consegui fazer da forma que vc falou.
Ele não reconhece o OracleTypes…

Estou fazendo da forma que já falei antes. Criei uma procedure, passo os parametros para ela que repassa para a função.

Abraços

O problema pode ser o seguinte:
O Owner da Tabela não é o mesmo usuário que vc usa para conectar ao banco de dados. Nesses casos, você que informar sob qual “schema” está a procedure. Além disso, o usuário deve ter direitos de acesso ao “schema” tbm…

Dessa forma:

CallableStatement callableStatement = con.prepareCall("{ Call [Schema do owner da function ou procedure].FUNC_UNIFICA_PACIENTE(?,?,?,?)}");

Dê uma olhada na documentação da Oracle

[quote=bernardo.rafael]
Dê uma olhada na documentação da Oracle

Valeu bernardo.rafael, por incrivel que pareça eu não havia encontrado essa documentação da Oracle.

Abraços

O “OracleTypes.CURSOR” foi só um exemplo, pro caso da sua função retornar um cursor com varios registros por exemplo… mas poderia ser qqer tipo de dados.