2013-06-27 52 views
1

下面是存儲過程從存儲過程的值:檢索使用本地SQL休眠

create or replace procedure 
proc_emp_name(v_emp out emp.emp_name%TYPE, v_empid in emp.emp_id%TYPE) 
is 
begin 
select emp_name into v_emp from emp where emp_id = v_empid; 
dbms_output.put_line('Emp Name: ' || v_emp); 
dbms_output.put_line('Procedure created successfully!!!'); 
end; 

我想調用這個使用本地SQL,跟着這個鏈接,但不知道如何從程序檢索OUT參數。

http://www.mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/

請讓我知道調用存儲過程並返回結果出來的最簡單的方法。

EDIT

如所建議的,檢查該文檔,我修改具有PROC第一參數作爲SYS_REFCURSOR如下:

create or replace procedure 
proc_empname_refcursor(v_empname OUT SYS_REFCURSOR, v_deptid in emp.emp_id%type) 
is 
begin 
open v_empname for select * from dept where dept_id = v_deptid; 
end; 

我能夠使用NamedQuery調用它,但我不由於其他限制,我們不想在映射文件中添加任何內容。我想下面的代碼調用進程內不使用NamedQuery但它並沒有制定出:

Query query = session.createSQLQuery(
       "CALL proc_empname_refcursor(?, :deptId)") 
       .addEntity(Dept.class) 
       .setParameter("deptId", new Integer(2)); 

      List<Dept> departments = query.list(); 
      for(int i=0; i<departments.size(); i++){ 
       Dept department = (Dept)departments.get(i); 
       System.out.println("Dept Id: " + department.getDeptId()); 
       System.out.println("Dept Name: " + department.getDeptName()); 
      } 

我得到異常:

org.hibernate.QueryException: Expected positional parameter count: 1, actual parameters: [] [CALL proc_empname_refcursor(?, :deptId)] 
at  org.hibernate.impl.AbstractQueryImpl.verifyParameters(AbstractQueryImpl.java:319) 
at org.hibernate.impl.SQLQueryImpl.verifyParameters(SQLQueryImpl.java:201) 
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:145) 
at com.jdbc.HibernateStartup.main(HibernateStartup.java:70) 

請讓我知道如何解決這個問題。

回答

6

我已經成功使用Hibernate和MS SQL Server中下面的代碼獲取從存儲過程的輸出參數:

@Override 
public Serializable generate(SessionImplementor session, Object object) throws HibernateException { 
    Connection connection = session.connection(); 
    CallableStatement callable = null; 
    try { 
     callable = connection.prepareCall("execute [procedure] ?"); 
     callable.registerOutParameter(1, Types.INTEGER); 
     callable.execute(); 
     int id = callable.getInt(1); 

     return id; 
    } catch (SQLException e) { 
     (...) 
    } finally { 
     (...) 
    } 
} 
+0

'session.connection()'已被棄用,有關如何替換這個問題的任何想法? – user182944

+0

您可以讓我知道您使用的是何種Hibernate版本? – vincentks

+0

我使用HIbernate v3.2.5 – user182944

1

Hibernate Docs

不能使用與Hibernate的存儲過程,除非你遵循一些過程/函數規則。

對於Oracle,函數必須返回結果集。過程的第一個參數必須是一個返回結果集的OUT。

+0

感謝您的信息。我可以通過將它添加到映射文件中來將proc作爲'named query'調用。但現在的問題是我不想在映射中添加它並將其用作命名查詢,而是直接使用'createSQLQuery'調用它。我嘗試過,但得到了一個異常:'org.hibernate.QueryException:期望的位置參數計數:1,實際參數:[] [CALL proc_empname_refcursor(?,:deptId)]'我已經更新了我的第一篇文章, ,請讓我知道如何解決這個異常。 – user182944

+0

刪除'?'。它應該是CALL proc_empname_refcursor(:deptId)。請參閱示例[here](http://parveengupta.blogspot.com/2011/03/hibernate-stored-procedure-call.html) – user1573133

+0

如果我刪除「?」那麼我得到這個異常:'java.sql.SQLException:ORA-06553:PLS-306:在調用'PROC_EMPNAME_REFCURSOR'' – user182944