java使用本机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
调用它,但由于其他一些限制,我不想在映射文件中添加任何内容。我尝试了下面的代码来调用proc,但没有使用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)
请让我知道如何解决这个问题
# 1 楼答案
我在Hibernate和MS SQL Server中使用以下代码成功地从存储过程中获取了out参数:
# 2 楼答案
从Hibernate Docs:
除非遵循某些过程/函数规则,否则不能将存储过程用于Hibernate
对于Oracle,函数必须返回结果集。过程的第一个参数必须是返回结果集的OUT