Now that stored procedure tests have been added, I noticed that on 5.2.0 neither one of the REFCURSOR tests works anymore.
To replicate it, first set up tests to run on PostgreSQL:
{noformat} > gradle clean testClasses -Pdb=pgsql {noformat}
Then run the {{org.hibernate.test.procedure.PostgreSQLStoredProcedureTest#testStoredProcedureOutParameter}} test.
You'll get the following error:
{noformat} javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: Error calling CallableStatement.getMoreResults
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:147) at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155) at org.hibernate.procedure.internal.ProcedureCallImpl.execute(ProcedureCallImpl.java:643) at org.hibernate.test.procedure.PostgreSQLStoredProcedureTest.testStoredProcedureOutParameter(PostgreSQLStoredProcedureTest.java:184) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) {noformat}
Because the input parameters are doubled:
{code:java} 13:28:46,836 DEBUG SQL:92 - {call sp_count_phones(?,?,?,?)} 13:28:46,838 TRACE BasicBinder:65 - binding parameter [1] as [BIGINT] - [1] 13:28:46,838 TRACE BasicBinder:65 - binding parameter [2] as [BIGINT] - [1] 13:28:46,844 WARN SqlExceptionHelper:129 - SQL Error: 0, SQLState: 42883 {code}
Even if there were only two registrations:
{code:java} StoredProcedureQuery query = entityManager.createStoredProcedureQuery( "sp_count_phones" ); query.registerStoredProcedureParameter( "personId", Long.class, ParameterMode.IN ); query.registerStoredProcedureParameter( "phoneCount", Long.class, ParameterMode.OUT );
query.setParameter( "personId", 1L );
query.execute(); Long phoneCount = (Long) query.getOutputParameterValue( "phoneCount" ); {code}
Most likely, the issue comes from {{ProcedureCallImpl}} where in the {{registerStoredProcedureParameter}} method, the {{registerParameter} { } method is called twice:
{code:java} registerParameter( (ParameterRegistrationImplementor) registerParameter( parameterName, type, mode ) ); {code}
|
|