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)的問題啦,存儲過程沒有給回其他的返回值唄。。。
