Como passar parametro para uma Procedure que possui campo CLOB (Oracle)

Pessoas

Preciso acessar uma Procedure que na entrada um campo CLOB exemplo :

Este campo é uma descrição muito grande que ultrapassa facilmente 200 caracteres do VARCHAR2

create or replace
PROCEDURE        "SP_ATUALIZA" (
          P_NUM_PROTOCOLO     IN NUMBER,
          P_DATA_GERACAO      IN DATE,
          P_PROCEDIMENTO      IN CLOB          
)AS	 

Tentei passar STRING do Java para o Oracle mas ele reclamou de parametro incorreto

Ai tentei :

st = conn.createStatement();
			CallableStatement stm = conn.prepareCall("{call SP_ATUALIZA(?,?,?)}");
			stm.setLong(1,Long.valueOf(protocolo));
			stm.setTimestamp(2,(Timestamp) solicitacao.getDataSolicitacao());
			stm.setClob(3,(java.sql.Clob)clob);
			stm.execute();

Mas ele tambem reclama.

Algum colega já passou por situacao parecida ?

Att

Vimieiro

Qual o erro? Mande o stacktrace completo.
Qual o tipo e o que contem a sua variável clob?

o Erro é o seguinte :

ORA-06550: line 1, column 48:
PLS-00564: lob arguments are not permitted in calls to remote server

A variavel que estou passando para a procedure contem CODIGO|STATUS|DESCRICAO; exemplo :

00001|N|esta é uma descricao completa exemplo de uma variavel que vai ser passada para uma procedure;

Ou seja é o código do registro, pipe, Status do registro, pipe, e a descricao terminando com ponto e virgula.

Agradeço qualquer ajuda.

:slight_smile: vimieiro

Não conhecia nada sobre este erro, mas pesquisando na internet, descobri que não é possível passar um CLOB como parâmetro para um stored procedure no Oracle em uma chamada remota. Li uma explicação para o motivo, que resumindo é deficiência do mecanismo de cominicação em chamada de procedures.

Indicaram uns workarounds (que estão para gambiarra pura):

  • quebrar o CLOB em n parametros do tipo VARCHAR2
  • criar uma tabela temporária com o CLOB e mudar a procedure para copiar o dado da tabela temporária para a tabela definitiva.

Sim amigo

Eu também li sobre o assunto.

A respeito de “quebrar” o parâmetro nao é possível, pois eu te relatei apenas um registro, mas pode ser N pois são procedimentos médicos e a pessoa pode fazer vários procedimentos em uma consulta.

Esta idéia da tabela temporária eu nao tinha conhecimento. Muito boa dica.

Valeu demais da conta

:slight_smile: vimieiro

http://docs.oracle.com/cd/B19306_01/java.102/b14355/oralob.htm#i1058044