`

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

阅读更多
   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里要要使用这个查询,你需要通过命名查询来映射它.
  
<sql-query    name="selectAllEmployees_SP"    callable="true">   
           <return    alias="emp"    class="Employment">   
                   <return-property    name="employee"    column="EMPLOYEE"/>   
                   <return-property    name="employer"    column="EMPLOYER"/>                           
                   <return-property    name="startDate"    column="STARTDATE"/>   
                   <return-property    name="endDate"    column="ENDDATE"/>                           
                   <return-property    name="regionCode"    column="REGIONCODE"/>                           
                   <return-property    name="id"    column="EID"/>                                                   
                   <return-property    name="salary">     
                           <return-column    name="VALUE"/>   
                           <return-column    name="CURRENCY"/>                           
                   </return-property>   
           </return>   
           {    ?    =    call    selectAllEmployments()    }   
   </sql-query>   



   注意存储过程当前仅仅返回标量和实体.现在不支持<return-join>和<load-collection> 
<hibernate-mapping package="com.unmi.vo"> <class name="Test" table="TEST"/>       

<sql-query callable="true" > 

<return alias="aa" > <return-property name="oborqt" column="OBORQT"/>

<return-property column="MOORQT"/> <return-property name="roschn" column="ROSCHN"/>

<return-property column="PLANDATE"/> 

<return> { ? = call selectAllUsers() } </sql-query> 

</hibernate-mapping>



   { ? = 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);


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

<sql-delete callable="true">{? = call deletePerson (?)}</sql-delete> 

<sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>





  简单的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;
                    }
                });



分享到:
评论

相关推荐

    oracle存储过程学习经典入门

    本文将从 Oracle 存储过程的基础知识开始,逐步深入到 Oracle 存储过程的高级应用,包括 Hibernate 调用 Oracle 存储过程和 Java 调用 Oracle 存储过程的方法。 Oracle 存储过程基础知识 Oracle 存储过程是 Oracle...

    oracle存储过程学习经典

    ### Oracle存储过程学习经典 #### Oracle存储过程基础知识与实践 Oracle存储过程是SQL与PL/SQL结合...通过深入研究这些知识点,可以充分发挥Oracle存储过程在现代数据库管理系统中的作用,提高数据处理效率和安全性。

    oracle 存储过程学习经典

    #### 七、关于Oracle存储过程的若干问题备忘 1. **数据表别名不能加as**: 在Oracle中,定义表别名时不能使用关键字`AS`。 2. **SELECT INTO 的使用**: 当使用`SELECT INTO`时,必须确保数据库中存在对应的记录,...

    Oracle PlSql 存储过程

    调用 Oracle 存储过程需要使用 Hibernate 的存储过程调用机制。 七、 用 Java 调用 Oracle 存储过程总结 用 Java 调用 Oracle 存储过程可以使用 JDBC 或 Oracle 的java驱动程序。下面是用 Java 调用 Oracle 存储...

    oracle存储过程学习经典[语法+实例+调用].doc

    - **Hibernate调用Oracle存储过程**:Hibernate框架支持调用存储过程,通过映射配置文件或注解指定存储过程的调用方式。 - **用Java调用Oracle存储过程**:使用`CallableStatement`接口来调用存储过程,设置输入...

    Oracle+PlSql存储过程

    6. 通过Hibernate调用Oracle存储过程,需要配置和编写映射元数据,以便ORM框架能够正确地调用和处理返回值。 7. 使用Java调用Oracle存储过程分为三种情况:无返回值的过程、有单个返回值的过程和返回列表的过程。 *...

    oracle存储过程学习经典[语法+实例+调用]

    Oracle存储过程是Oracle数据库中一种用于封装SQL语句、PL/SQL语句或Java语句的程序单元,它可以包含一系列操作,使得商业规则和业务逻辑可以从应用程序中独立出来,集中存储在数据库中。存储过程的好处包括代码的...

    oracle存储过程学习经典[语法+实例+调用].docx

    下面我们将深入探讨Oracle存储过程的基础知识、基本语法以及在实际应用中的一些常见问题和调用方式。 1. **Oracle存储过程基础知识** - 存储过程是一组为了完成特定功能的SQL和PL/SQL语句集合,它们被预先编译并...

    oracle存储过程(语法+实例).docx

    - 在存储过程中,`SELECT` 后的字段必须跟 `INTO` 关键字,将结果保存到变量中,除非使用游标处理多行记录。 - 使用 `SELECT...INTO...` 时,确保查询结果存在,否则会抛出"No data found"异常。 - 别名不应与...

    2022oracle存储过程procedure秘籍参照.pdf

    在2022Oracle存储过程procedure秘籍参照中,主要涵盖了以下几个关键知识点: 1. **Oracle 存储过程基础知识**:这部分介绍了存储过程的概念,它允许将一组相关的操作打包在一起,便于重用和管理。存储过程可以包含...

    oracle存储过程学习经典入门.doc

    Oracle存储过程是由一系列的SQL和PL/SQL语句组成的,它们被存储在数据库中并可以按需调用。PL/SQL是Oracle专有的编程语言,它扩展了SQL的功能,包括控制结构、变量、函数和异常处理。 **Oracle存储过程的基本语法**...

    Oracle PlSql存储过程

    **关于Oracle存储过程的若干问题备忘** 1. **数据表别名**:在Oracle中,为表指定别名时不使用`AS`关键字,而是直接使用`table_name alias_name`。 2. **SELECT INTO**:在存储过程中,使用`SELECT`语句时,若要将...

    自学oracle存储过程

    关于 Oracle 存储过程的若干问题备忘...........................................................................................4 1. 在 Oracle 中,数据表别名不能加 as。......................................

    java记事簿管理系统_备忘录管理系统_通讯录_记账本-源码+数据库+论文or文档.zip

    9. **数据持久化**:除了使用数据库存储数据外,系统可能还使用了ORM(Object-Relational Mapping)框架如Hibernate或MyBatis,以简化数据库操作,实现对象与数据库表之间的映射。 10. **文档和论文**:压缩包中...

    备忘录

    在应用程序中,通常会使用ORM(对象关系映射)框架如Hibernate或MyBatis来简化数据库操作,将数据库操作与业务逻辑解耦。 【系统事件获取】是指程序能够监听和响应操作系统级别的事件,比如键盘输入、鼠标移动、...

    java web开发典型模块大全

    在实际项目中,通常会结合使用MVC框架(如Spring MVC)、ORM框架(如Hibernate)和模板引擎(如FreeMarker)来提高开发效率和代码质量。同时,了解并遵循最佳实践,如使用RESTful API设计、实现单元测试和集成测试,...

    个人生活助手——java

    9. **个人备忘录管理**:备忘录的创建、更新、删除和查询功能可以通过CRUD操作实现,可能使用到集合框架如ArrayList或LinkedList,以及日期时间处理类如Java 8的LocalDateTime。 10. **娱乐天地**:这部分可能包含...

    高级java工程师面试考纲,java高级工程师进阶知识地图

    - **ORM框架**:至少精通一个ORM框架(如Hibernate、MyBatis),理解对象关系映射的概念及其在项目中的应用。 #### 数据结构与算法 1. **基础数据结构** - **线性表与树**:掌握数组、链表、树等基本数据结构的...

Global site tag (gtag.js) - Google Analytics