Erro ao chamar StoredProcedure JPA

6 respostas Resolvido
java
E

Pessoal, boa tarde!
Estou tentando chamar uma procedure e um dos parâmetros é tanto de entrada quanto de saída, porém estoura o erro: Unable to extract OUT/INOUT parameter value; nested exception is org.hibernate.exception.GenericJDBCException: Unable to extract OUT/INOUT parameter value

Alguém saberia dizer onde está o erro?

Segue abaixo código:

"@Entity

@NamedStoredProcedureQueries({

@NamedStoredProcedureQuery(

name = “Proc3.getTeste”,

procedureName = “sp_iSolicitacaoSistema”,

resultClasses = { Proc3.class },

parameters = {

@StoredProcedureParameter(name = “pt_xml”,type = String.class, mode = <a href="http://ParameterMode.IN">ParameterMode.IN</a>),

@StoredProcedureParameter(name = pi_solicitacao,type = Integer.class, mode = ParameterMode.INOUT)

})

})

public class Proc3 {
@Id
@Column(name="pi_solicitacao")
private Integer piSolicitacao;

}

public interface Proc3Repository extends CrudRepository<Proc3, Integer>{

@Procedure(spoc3_iSolicitacaoSistema)

public Proc3 getTeste(@Param(pt_xml) String pt_xml, @Param(pi_solicitacao) Integer pisolicitacao);

}"

Trecho da chamada:
"Proc3 testeSQL = proc3Repo.getTeste(xml,0);

Procedure:

GO

DECLARE @RC int
DECLARE @pt_xml varchar(max)
DECLARE @pi_solicitacao int = 0

– TODO: Set parameter values here.

set @pt_xml = ‘<?xml version="1.0" encoding="ISO-8859-1"?>’

EXECUTE @RC = [dbo].[spoc3_iSolicitacaoSistema]
@pt_xml
,@pi_solicitacao OUTPUT

set @pi_solicitacao = 123;
GO"

6 Respostas

M

Opa.

Cara pelo que entendi sua proc não esta retornando os resultados esperados pela JPA, veja se realmente @pi_solicitacao eh INOUT ou somente IN e se ela esta realmente executando um SELECT para preencher o objeto Proc3.

\o

E

Então cara isso é legado pra variar né haha
Mas pelo que vi existe uma rotina em .net que executa essa procedure e obtém o retorno.
Olhei na proc e ela tá com IN OUT sim

M

Opa.

Legal então, dentro da procedure existe algum select que quando vc chama diretamente a procedure aparece o resultado para vc desse select ?

\o

E

Quando executo a procedure direto na base ele não me retorna nada (o que achei estranho) mas executa com sucesso, quando olhei o q ela fazia vi que ele apenas faz um set @pi_solicitacao = NNN
No meu ponto de vista deveria ter um select ou return, mas não tem, o que chama a atenção é outra rotina tá funcionando

Obs.: não tenho autonomia não base de dados pra alterar a proc e nem criar uma nova para teste :confused:

J

Usa JDBC diretamente, muito mais simples e menos overhead.

https://www.mkyong.com/jdbc/jdbc-callablestatement-stored-procedure-out-parameter-example/

E
Solucao aceita

Acabei mudando a estratégia, não é o que queria, mas ta funcionando e é o que importa rs…

public Integer procedureJdbcTemplate() {
List parameters = Arrays.asList(new SqlParameter(Types.VARCHAR), new SqlOutParameter(“pi_solicitacao”, Types.INTEGER));

Map<String, Object> call = jdbcTemplate.call(new CallableStatementCreator() {
        @Override
        public CallableStatement createCallableStatement(Connection con) throws SQLException {
            CallableStatement callableStatement = con.prepareCall("{call spoc3_iSolicitacaoSistema(?, ?)}");
            callableStatement.setString(1, pi_xml);
            callableStatement.registerOutParameter(2, Types.INTEGER);
            return callableStatement;
        }
    }, parameters);
    
    return (Integer) call.get("pi_solicitacao");
}
Criado 4 de janeiro de 2019
Ultima resposta 7 de jan. de 2019
Respostas 6
Participantes 3