一、函数
第一种方式:获得connection
Connection conn = session.connection();
CallableStatement call = conn.prepareCall("{?=call getemp.getempc(?)}");
call.registerOutParameter(1, OracleTypes.CURSOR);// 设置输出变量类型
call.setInt(2, 10);
call.executeQuery();
ResultSet rs = (ResultSet) call.getObject(1);
while (rs.next()) {
System.out.println(rs.getString(3));
}
对应函数包体:
create or replace package body getemp is
function getempc(dno number) return sys_refcursor
is
type emp_cursor_type is ref cursor;
emp_cursor emp_cursor_type;
begin
open emp_cursor for select * from scott.emp where deptno=dno;
return emp_cursor;
end;
end getemp;
第二种方式:通过配置XML
<sql-query name="funtest" callable="true">
<return alias="emp" class="org.han.entity.Emp">
<return-property name="empno" column="empno"></return-property>
<return-property name="ename" column="ename"></return-property>
<return-property name="job" column="job"></return-property>
<return-property name="mgr" column="mgr"></return-property>
<return-property name="hiredate" column="hiredate"></return-property>
<return-property name="sal" column="sal"></return-property>
<return-property name="comm" column="comm"></return-property>
<return-property name="dept" column="deptno"></return-property>
<return-property name="version" column="version"></return-property>
</return>
{?=call getemp.getempc(?)}
</sql-query>
List<Emp> emps=session.getNamedQuery("funtest").setInteger(0, 10).list();
for (Emp emp : emps) {
System.out.println(emp);
}
第三种方式:自定义方言
二、过程
对应的过程:
create or replace procedure getdeptbyid(d out sys_refcursor,dno number,num number )
is
begin
open d for select * from dept where deptno=dno and 1=num;
end;
第一种方式:获得connection
Connection conn = session.connection();
CallableStatement call = conn.prepareCall("{call getdeptbyid(?,?,?)}");
call.registerOutParameter(1, OracleTypes.CURSOR);// 设置输出变量类型
call.setInt(2, 10);
call.setInt(3, 1);
call.executeQuery();
ResultSet rs = (ResultSet) call.getObject(1);
while (rs.next()) {
System.out.println(rs.getString(2));
}
第二种方式:通过配置XML
<sql-query name="getdeptbyid" callable="true">
<return alias="dept" class="org.han.entity.Dept">
<return-property name="deptno" column="deptno"></return-property>
<return-property name="dname" column="dname"></return-property>
<return-property name="loc" column="loc"></return-property>
</return>
{call getdeptbyid(?,?,?)}
</sql-query>
Dept dept=(Dept)session.getNamedQuery("getdeptbyid").setInteger(0, 10).setInteger(1, 1).uniqueResult();
System.out.println(dept.getDname());
三、使用限制
对存储过程进行的查询无法使用 setFirstResult()/setMaxResults()
进行分页。
对于 Sybase 或者 MS SQL server 有如下规则: