oracle存储过程备忘以及在Hibernate中使用存储过程
Oracle存储过程主要用来处理复杂业务逻辑,把应用系统中的这些逻辑(代码,如java形式)放到数据库(pl/sql形式)中执行。可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,执行效率更高。
在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:
create or replace procedure batchUpdateStudent(p_age in number) asbeginupdate STUDENT set AGE=AGE+1 where AGE>p_age;end;
//hibernater 不支持直接更新或删除的存储过程,可以绕过Hibernate,//而在Hibernate中直接使用JDBCtx = session.beginTransaction();Connection con=session.connection();String procedure = "{call batchUpdateStudent(?) }";CallableStatement cstmt = con.prepareCall(procedure);cstmt.setInt(1,0); //把年龄参数设为0cstmt.executeUpdate();tx.commit();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;
<sql-query name="selectAllEmployees_SP" callable="true"> <return alias="emp" 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> <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>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>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; } });