Erro ao executar uma procedure em Java com o CallableStatemant

8 respostas
R

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

8 Respostas

D

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

Até mais!

R

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

Até mais!

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.

F

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

R

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

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.

R

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

B

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

R

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

F

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.

Criado 23 de julho de 2007
Ultima resposta 27 de jul. de 2007
Respostas 8
Participantes 4