簡體   English   中英

使用本機SQL Hibernate從存儲過程中檢索值

[英]Retrieving a value from Stored Procedure using Native SQL Hibernate

下面是存儲過程:

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/

請讓我知道最簡單的方法來調用該過程並從中獲取結果。

編輯

根據建議,檢查文檔后,我將具有第一個參數的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情況下調用proc,但沒有成功:

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)

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

我設法在Hibernate和MS SQL Server中使用以下代碼從存儲過程中獲取out參數:

@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 {
        (...)
    }
}

Hibernate Docs中

除非遵循某些過程/功能規則,否則您不能在Hibernate中使用存儲過程。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM