ibatis調用存儲過程
⑴ its調用存儲過程事例
2009-07-30
ibatis調用oracle存儲過程分頁
關鍵字: oracle存儲過程分頁
1、users.xml片段
Xml代碼
<resultMap class="user" id="get-all-user">
<result property="id" column="id" />
<result property="userName" column="username" />
<result property="password" column="password" />
</resultMap>
……
<parameterMap id="swapParameters" class="java.util.Map">
<parameter property="sqlscript" jdbcType="VARCHAR2" javaType="java.lang.String" mode="IN"/>
<parameter property="pageSize" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>
<parameter property="pageIndex" jdbcType="INTEGER" javaType="java.lang.Integer" mode="IN"/>
<parameter property="totalCount" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
<parameter property="totalPage" jdbcType="INTEGER" javaType="java.lang.Integer" mode="OUT"/>
<parameter property="v_cur" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR" mode="OUT" resultMap="get-all-user" />
</parameterMap>
<procere id="retrieveByLikeCmpRoleC" parameterMap="swapParameters">
{call P_QuerySplit(?,?,?,?,?,?)}
</procere>
2、oracle存儲過程
Java代碼
create or replace procere P_QuerySplit(sqlscript varchar2, --表名/SQL語句
pageSize integer, --每頁記錄數
pageIndex integer, --當前頁
totalCount out number, --總記錄數
totalPage out number, --總頁數
v_cur out sys_refcursor --返回遊標
) is
v_PageSize number;
v_PageIndex number;
v_SQL_Count varchar2(4000);
v_SQL varchar2(4000);
v_StartIndex number;
v_EndIndex number;
begin
v_PageSize := pageSize;
if v_PageSize = 0 then
v_PageSize := 1;
end if;
--統計記錄數量
v_SQL_Count := 'select count(*) from (' || sqlscript || ') a ';
execute immediate v_SQL_Count
into totalCount;
--計算總頁數
totalPage := CEIL(totalCount / v_PageSize);
--驗證頁號 如果頁號大余了最大頁數,返回最後一頁
v_PageIndex := pageIndex;
if v_PageIndex > totalPage then
v_PageIndex := totalPage;
end if;
--計算開始的Index和結束的Index
v_StartIndex := (v_PageIndex - 1) * v_PageSize + 1;
v_EndIndex := v_PageIndex * v_PageSize;
v_SQL := 'SELECT /*+ FIRST_ROWS */* FROM (';
v_SQL := v_SQL || ' SELECT A.*, ROWNUM RN ';
v_SQL := v_SQL || ' FROM (' || sqlscript || ') A ';
v_SQL := v_SQL || ' WHERE ROWNUM <= ' || v_EndIndex;
v_SQL := v_SQL || ')WHERE RN >= ' || v_StartIndex;
open v_cur for v_SQL;
end P_QuerySplit;
3、中調用
Java代碼
Map b = new HashMap();
b.put("sqlscript", " users ");
b.put("pageSize", Integer.parseInt("2"));
b.put("pageIndex", Integer.parseInt("3"));
getSqlMapClientTemplate().queryForList("retrieveByLikeCmpRoleC", b);
System.out.println("總記錄數:"+b.get("totalCount"));
System.out.println("總頁數:"+b.get("totalPage"));
List<Users> listusers =(List<Users>) b.get("v_cur");
for(Users p:listusers){
System.out.println(p.getId()+"---"+p.getUserName()+"---"+p.getPassword());
}
備註:由於oracle的存儲過程有2種寫法,一種是FUNCTION函數,一種是procere。他們的返回值的寫法不一樣,如:
Java代碼
CREATE OR REPLACE PACKAGE REFS_PCK AS
TYPE REF_CURSOR_T IS REF CURSOR;
FUNCTION GET_REFS RETURN REF_CURSOR_T;
procere getFlowTrack(cur_Scan out REF_CURSOR_T,
cur_Send out REF_CURSOR_T);
END REFS_PCK;
/
CREATE OR REPLACE PACKAGE BODY REFS_PCK IS
FUNCTION GET_REFS RETURN REF_CURSOR_T IS
L_CURSOR REF_CURSOR_T;
BEGIN
OPEN L_CURSOR FOR
SELECT * FROM USERS;
RETURN L_CURSOR;
END GET_REFS;
procere getFlowTrack(cur_Scan out REF_CURSOR_T,
cur_Send out REF_CURSOR_T) as
begin
--1
open cur_Scan for
select * from USERS;
--2
open cur_Send for
select * from USERS;
end getFlowTrack;
END REFS_PCK;
那麼在xml中的調用,針對函數的是:
Xml代碼
<procere id="getRefs" parameterMap="output">{ ? = call refs_pck.get_refs }</procere>
針對procere的是
Xml代碼
<procere id="getRefsaa" parameterMap="outputaa">{ call refs_pck.getFlowTrack(?,?) }</procere>
即一個有「?」,一個沒有。第二個注意的地方是:oracle存儲過程中的參數類型number對應的java中的類型還是java.lang.Integer
v
⑵ ibatis調存儲過程,出現數組越界錯誤,怎麼改
你可以把調用存儲過程時的那個proDto參數改為HashMap嘗試一下埃map裡面put一個name為PRM_IDCARD然後在put一個PRM_NAME兩個參數進去,,調用完成後獲取PRM_NAME試試。
⑶ ibatis調用oracle存儲過程返回結果為boolean的問題
<parameter property="retBool" jdbcType="boolean" javaType="java.lang.Boolean" mode="INOUT"/>
應該是布爾型的 參數類型沖突 你該下試試謝謝
⑷ ibatis調存儲過程報錯
你的資料庫里的欄位要跟java 的欄位匹配上
⑸ ibatis 存儲過程的 查詢
queryForList返回的是List,queryForObject返回的是Object;
to LS:ibatis可以調用存儲過程。
⑹ spring+ibatis 調用Oracle存儲過程出錯
jdbcType應該採用標準的數據類型,varchar2是oracle自定義的,非標準的。
改成 jdbcType="VARCHAR" 再試試
⑺ ibatis調用mysql存儲過程,沒有結果集返回,求高手求救
calltotalUsers(?,?,?,?)
有問題吧?
改為
calltotalUsers(#{key1},#{key2},#{key3},#{key4})
key1~key4為paramMap里對應的鍵值
⑻ ibatis調用存儲過程,存儲過程可以返回多個cursor嗎
一個存儲過程中可以定義多個cursor啊。游標可以嵌套執行,也可以順序執行。不過記得要將found這個變數的值在需要的地方設置為true。否則就不繼續執行了。
⑼ ibatis調用存儲過程返回多個結果集,ibatis里怎樣配置能在java里獲取這幾個結果集
那就是你的存儲過程(report_day.report_day_pro)的問題啦,存儲過程沒有給回其他的返回值唄。。。