休眠:调用存储过程将返回游标 [英] Hibernate: Calling stored procedure returns cursor
本文介绍了休眠:调用存储过程将返回游标的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在Hibernate 4.2中,我尝试调用返回游标的存储过程(我使用Oracle DB).
In Hibernate 4.2 I try to call stored procedure that returns cursor (I use Oracle DB).
过程如下:
PROCEDURE SYS_columnNames ( ownerIn in sys.all_tab_cols.owner%type,
tableName in sys.all_tab_cols.table_name%type,
resultCur out curRef )
is
begin
open resultCur for
select column_name from sys.all_tab_cols
where owner = ownerIn
and Upper(Trim(table_name)) = tableName
order by column_name;
exception
when others then
null;
end SYS_columnNames ;
还有我的Java代码:
And my Java code:
Session session = null;
try
{
SessionFactory sessionFactory = sessionFactoryManager.getCurrentSession();
session = sessionFactory.openSession();
return session.doReturningWork( new ReturningWork< T >()
{
@SuppressWarnings( "unchecked" )
@Override
public T execute( Connection aConnection ) throws SQLException
{
CallableStatement callstm = null;
try
{
String functionCall = "{call " + aProcedureName + "(:owner, :tableName, :rescur)}";
callstm = aConnection.prepareCall( functionCall );
callstm.setString( "owner", "MYOWNER" );
callstm.setString( "tableName", "USER_TABLE" );
callstm.registerOutParameter( "rescur", OracleTypes.CURSOR );
callstm.execute();
return (T)callstm.getObject( 3 );
}
finally
{
closeQuietly( callstm );
}
}
} );
}
finally
{
closeQuietly( session );
}
但这给我一个错误:
org.hibernate.exception.GenericJDBCException: error executing work
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:54)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.coordinateWork(JdbcCoordinatorImpl.java:289)
at org.hibernate.internal.SessionImpl.doWork(SessionImpl.java:1953)
at org.hibernate.internal.SessionImpl.doReturningWork(SessionImpl.java:1949)
(...)
Caused by: java.sql.SQLException: operation not allowed: Ordinal binding and Named binding cannot be combined!
at oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:2027)
at oracle.jdbc.driver.OracleCallableStatementWrapper.getObject(OracleCallableStatementWrapper.java:816)
at org.hibernate.jdbc.WorkExecutor.executeReturningWork(WorkExecutor.java:72)
at org.hibernate.internal.SessionImpl$3.accept(SessionImpl.java:1946)
at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.coordinateWork(JdbcCoordinatorImpl.java:284)
... 58 more
我完全不知道如何调用返回游标的存储过程.任何帮助将不胜感激.
I totally don't know how to call stored procedure that returns cursor. Any help will be appreciated.
推荐答案
解决方案是使用?"而不是变量名:
Solution for that is to use '?' instead of variable names:
String functionCall = "{call " + aProcedureName + "(?, ?, ?)}";
callstm = aConnection.prepareCall( functionCall );
callstm.setString( 1, "MYOWNER" );
callstm.setString( 2, "USER_TABLE" );
callstm.registerOutParameter( 3, OracleTypes.CURSOR );
这篇关于休眠:调用存储过程将返回游标的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文