打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
oracle存储过程备忘以及在Hibernate中使用存储过程

oracle存储过程备忘以及在Hibernate中使用存储过程

   Oracle存储过程主要用来处理复杂业务逻辑,把应用系统中的这些逻辑(代码,如java形式)放到数据库(pl/sql形式)中执行。可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,执行效率更高。
    在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:
Java代码
 
  1. create or replace procedure batchUpdateStudent(p_age in number) as   
  2. begin   
  3. update STUDENT set AGE=AGE+1 where AGE>p_age;   
  4. end;  

   以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程:
Java代码
 
  1. //hibernater 不支持直接更新或删除的存储过程,可以绕过Hibernate,   
  2. //而在Hibernate中直接使用JDBC   
  3.   
  4. tx = session.beginTransaction();   
  5. Connection con=session.connection();   
  6.   
  7. String procedure = "{call batchUpdateStudent(?) }";   
  8. CallableStatement cstmt = con.prepareCall(procedure);   
  9. cstmt.setInt(1,0); //把年龄参数设为0   
  10. cstmt.executeUpdate();   
  11. tx.commit();  


  使用存储过程来查询  
   Hibernate3引入了对存储过程查询的支持。存储过程必须返回一个结果集,作为Hibernate能够使用的第一个外部参数。下面是一个Oracle9i和更高版本的存储过程例子。
   
Java代码
 
  1. Create or REPLACE FUNCTION selectAllEmployments        
  2. RETURN    SYS_REFCURSOR        
  3.    AS        
  4.       st_cursor    SYS_REFCURSOR;        
  5.    BEGIN        
  6.      OPEN st_cursor FOR        
  7.      Select EMPLOYEE,EMPLOYER,        
  8.      STARTDATE, ENDDATE,        
  9.      REGIONCODE, EID, VALUE, CURRENCY        
  10.      FROM EMPLOYMENT;        
  11.      RETURN st_cursor;        
  12. END;     

   在Hibernate里要要使用这个查询,你需要通过命名查询来映射它.
  
Java代码
 
  1. <sql-query    name="selectAllEmployees_SP"    callable="true">      
  2.            <return    alias="emp"    class="Employment">      
  3.                    <return-property    name="employee"    column="EMPLOYEE"/>      
  4.                    <return-property    name="employer"    column="EMPLOYER"/>                              
  5.                    <return-property    name="startDate"    column="STARTDATE"/>      
  6.                    <return-property    name="endDate"    column="ENDDATE"/>                              
  7.                    <return-property    name="regionCode"    column="REGIONCODE"/>                              
  8.                    <return-property    name="id"    column="EID"/>                                                      
  9.                    <return-property    name="salary">        
  10.                            <return-column    name="VALUE"/>      
  11.                            <return-column    name="CURRENCY"/>                              
  12.                    </return-property>      
  13.            </return>      
  14.            {    ?    =    call    selectAllEmployments()    }      
  15.    </sql-query>     


   注意存储过程当前仅仅返回标量和实体.现在不支持<return-join>和<load-collection> 
Java代码
 
  1. <hibernate-mapping package="com.unmi.vo"> <class name="Test" table="TEST"/>          
  2.   
  3. <sql-query callable="true" >    
  4.   
  5. <return alias="aa" > <return-property name="oborqt" column="OBORQT"/>   
  6.   
  7. <return-property column="MOORQT"/> <return-property name="roschn" column="ROSCHN"/>   
  8.   
  9. <return-property column="PLANDATE"/>    
  10.   
  11. <return> { ? = call selectAllUsers() } </sql-query>    
  12.   
  13. </hibernate-mapping>  


   { ? = call selectAllUsers() } 也可以写成{ call selectAllUsers() }, 如果有参数就写成 { ? = call selectAllUsers(?,?,?) } 代码中对query设置相应位置上的值就OK Java调用关键代码如下
Java代码
 
  1. Session session = HibernateUtil.currentSession();   
  2.   
  3. Query query = session.getNamedQuery("selectAllUsers");    
  4.   
  5. List list = query.list();   
  6.   
  7. System.out.println(list);  

   要求你的存储过程必须能返回记录集,否则要出错 如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签
Java代码
 
  1. <sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>   
  2.   
  3. <sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>    
  4.   
  5. <sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>  




  简单的Hibernate调用oracle存储过程方式:
Java代码
 
  1. this.pnumberManager.getHibernateTemplate().execute(   
  2.                 new HibernateCallback() ...{   
  3.                     public Object doInHibernate(Session session)   
  4.                             throws HibernateException, SQLException ...{   
  5.                         CallableStatement cs = session   
  6.                                 .connection()   
  7.                                 .prepareCall("{call modifyapppnumber_remain(?)}");   
  8.                         cs.setString(1, foundationid);   
  9.                         cs.execute();   
  10.                         return null;   
  11.                     }   
  12.                 });  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
使用SQLQuery
Hibernate3.x调用存储过程(转)
Hibernate sql查询
精通Hibernate
Hibernate—第一季who are you
hibernate之缓存使用二
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服