博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle存储过程备忘以及在Hibernate中使用存储过程
阅读量:2395 次
发布时间:2019-05-10

本文共 2909 字,大约阅读时间需要 9 分钟。

Oracle存储过程主要用来处理复杂业务逻辑,把应用系统中的这些逻辑(代码,如java形式)放到数据库(pl/sql形式)中执行。可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,执行效率更高。
在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:
create or replace procedure batchUpdateStudent(p_age in number) as begin update STUDENT set AGE=AGE+1 where AGE>p_age; end;
以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程:
//hibernater 不支持直接更新或删除的存储过程,可以绕过Hibernate, //而在Hibernate中直接使用JDBC tx = session.beginTransaction(); Connection con=session.connection(); String procedure = "{call batchUpdateStudent(?) }"; CallableStatement cstmt = con.prepareCall(procedure); cstmt.setInt(1,0); //把年龄参数设为0 cstmt.executeUpdate(); tx.commit();
使用存储过程来查询
Hibernate3引入了对存储过程查询的支持。存储过程必须返回一个结果集,作为Hibernate能够使用的第一个外部参数。下面是一个Oracle9i和更高版本的存储过程例子。
Create or REPLACE FUNCTION selectAllEmployments     RETURN    SYS_REFCURSOR        AS           st_cursor    SYS_REFCURSOR;        BEGIN          OPEN st_cursor FOR          Select EMPLOYEE,EMPLOYER,          STARTDATE, ENDDATE,          REGIONCODE, EID, VALUE, CURRENCY          FROM EMPLOYMENT;          RETURN st_cursor;     END;
在Hibernate里要要使用这个查询,你需要通过命名查询来映射它.
{ ? = call selectAllEmployments() }
注意存储过程当前仅仅返回标量和实体.现在不支持<return-join>和<load-collection>
     
{ ? = call selectAllUsers() }
{ ? = call selectAllUsers() } 也可以写成{ call selectAllUsers() }, 如果有参数就写成 { ? = call selectAllUsers(?,?,?) } 代码中对query设置相应位置上的值就OK Java调用关键代码如下
Session session = HibernateUtil.currentSession(); Query query = session.getNamedQuery("selectAllUsers"); List list = query.list(); System.out.println(list);
要求你的存储过程必须能返回记录集,否则要出错 如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签
{call createPerson (?, ?)}
{? = call deletePerson (?)}
{? = call updatePerson (?, ?)}
简单的Hibernate调用oracle存储过程方式:
this.pnumberManager.getHibernateTemplate().execute(                 new HibernateCallback() ...{
public Object doInHibernate(Session session) throws HibernateException, SQLException ...{
CallableStatement cs = session .connection() .prepareCall("{call modifyapppnumber_remain(?)}"); cs.setString(1, foundationid); cs.execute(); return null; } });

转载地址:http://uiwob.baihongyu.com/

你可能感兴趣的文章
编译原理 词法分析
查看>>
计算机系统结构 计算机指令集结构
查看>>
计算机系统结构 输入/输出系统
查看>>
信息安全技术及应用 常规加密技术
查看>>
02-线性结构1 两个有序链表序列的合并
查看>>
HDU 1080 DP LCS
查看>>
HDU 3308 线段树+区间合并
查看>>
ASP.NET 入手页面控件及事件触发
查看>>
HDU 4123 树状DP+RMQ
查看>>
vim配置文件(持续更新)
查看>>
Fedora 16下添加终端快捷键
查看>>
HDU 4001 DP LIS
查看>>
HDU 4023 贪心+博弈
查看>>
HDU 4036 物理坑爹题
查看>>
Linux文件解压命令汇总(持续更新)
查看>>
HDU 4046 树状数组
查看>>
HDU 4034 图论 Floyd
查看>>
HDU 4027 线段树
查看>>
HDU 4049 状态压缩DP
查看>>
SGU 253 计算几何 判定点是否在凸包内
查看>>