oracle存儲(chǔ)過(guò)程備忘以及在Hibernate中使用存儲(chǔ)過(guò)程
Oracle存儲(chǔ)過(guò)程主要用來(lái)處理復(fù)雜業(yè)務(wù)邏輯,把應(yīng)用系統(tǒng)中的這些邏輯(代碼,如java形式)放到數(shù)據(jù)庫(kù)(pl/sql形式)中執(zhí)行??梢酝ㄟ^(guò)存儲(chǔ)過(guò)程來(lái)執(zhí)行批量更新。存儲(chǔ)過(guò)程直接在數(shù)據(jù)庫(kù)中運(yùn)行,執(zhí)行效率更高。
在Oracle數(shù)據(jù)庫(kù)中可以定義一個(gè)名為batchUpdateStudent()的存儲(chǔ)過(guò)程,代碼如下:
create or replace procedure batchUpdateStudent(p_age in number) as begin update STUDENT set AGE=AGE+1 where AGE>p_age; end; 以上存儲(chǔ)過(guò)程有一個(gè)參數(shù)p_age,代表學(xué)生的年齡,應(yīng)用程序可按照以下方式調(diào)用存儲(chǔ)過(guò)程:
//hibernater 不支持直接更新或刪除的存儲(chǔ)過(guò)程,可以繞過(guò)Hibernate,
//而在Hibernate中直接使用JDBC
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call batchUpdateStudent(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年齡參數(shù)設(shè)為0
cstmt.executeUpdate();
tx.commit();
使用存儲(chǔ)過(guò)程來(lái)查詢(xún) Hibernate3引入了對(duì)存儲(chǔ)過(guò)程查詢(xún)的支持。存儲(chǔ)過(guò)程必須返回一個(gè)結(jié)果集,作為Hibernate能夠使用的第一個(gè)外部參數(shù)。下面是一個(gè)Oracle9i和更高版本的存儲(chǔ)過(guò)程例子。
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里要要使用這個(gè)查詢(xún),你需要通過(guò)命名查詢(xún)來(lái)映射它.
<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>
注意存儲(chǔ)過(guò)程當(dāng)前僅僅返回標(biāo)量和實(shí)體.現(xiàn)在不支持<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() } 也可以寫(xiě)成{ call selectAllUsers() }, 如果有參數(shù)就寫(xiě)成 { ? = call selectAllUsers(?,?,?) } 代碼中對(duì)query設(shè)置相應(yīng)位置上的值就OK Java調(diào)用關(guān)鍵代碼如下
Session session = HibernateUtil.currentSession();
Query query = session.getNamedQuery("selectAllUsers");
List list = query.list();
System.out.println(list);
要求你的存儲(chǔ)過(guò)程必須能返回記錄集,否則要出錯(cuò) 如果你的存儲(chǔ)過(guò)程是完成非查詢(xún)?nèi)蝿?wù)就應(yīng)該在配置文件用以下三個(gè)標(biāo)簽
<sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>
<sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>
<sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>
簡(jiǎn)單的Hibernate調(diào)用oracle存儲(chǔ)過(guò)程方式:
|
|
|