【问题标题】:Hibernate: Calling stored procedure returns cursorHibernate:调用存储过程返回游标
【发布时间】:2013-12-19 07:40:56
【问题描述】:

在 Hibernate 4.2 中,我尝试调用返回游标的存储过程(我使用 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 代码:

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

我完全不知道如何调用返回游标的存储过程。任何帮助将不胜感激。

【问题讨论】:

  • 我知道我做错了什么...应该有: String functionCall = "{call " + aProcedureName + "(?, ?, ?)}"; callstm = aConnection.prepareCall(functionCall); callstm.setString(1, "MYOWNER"); callstm.setString(2, "USER_TABLE");调用stm.registerOutParameter(3, OracleTypes.CURSOR);
  • 很好,然后回答您自己的问题并在两天后接受。您已设法找到自己问题的答案。

标签: oracle hibernate stored-procedures cursor


【解决方案1】:

解决方案是使用 '?'而不是变量名:

String functionCall = "{call " + aProcedureName + "(?, ?, ?)}"; 
callstm = aConnection.prepareCall( functionCall ); 
callstm.setString( 1, "MYOWNER" ); 
callstm.setString( 2, "USER_TABLE" ); 
callstm.registerOutParameter( 3, OracleTypes.CURSOR );

【讨论】:

    【解决方案2】:

    问题在于以下陈述之一

    callstm.registerOutParameter( "rescur", OracleTypes.CURSOR );
    callstm.execute();
    return (T)callstm.getObject( 3 );
    

    在上面的代码中,当您在第 1 行设置参数时;您正在使用命名参数绑定,而当您取回结果时,您正在使用序数绑定,即第 3 行;如果您将第 3 行命名为如下所示的绑定; 那么它会正常工作

    return (T)callstm.getObject("rescur");
    

    我使用了与您相同的代码;只需更正 return 语句,它就像一个魅力。

    编码愉快!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-18
      • 2016-05-30
      • 1970-01-01
      • 2011-01-24
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多