存儲過程使用遊標變量返回結果集java
1)登陸SQLPLUS,用戶爲SCOTT,利用該用戶提供的表EMPsql
[sql] 數據庫
C:/Users/Administrator>sqlplus scott/scott 服務器
2)編寫一個FUNCTION,返回值爲遊標變量指針
[sql] code
CREATE OR REPLACE FUNCTION GETEMPCURSOR(PRM_CHOICE IN NUMBER) 接口
RETURN SYS_REFCURSOR 內存
IS get
EMPCURSOR SYS_REFCURSOR; 登錄
BEGIN
IF PRM_CHOICE = 1 THEN
OPEN EMPCURSOR FOR SELECT * FROM EMP WHERE DEPTNO = 10;
ELSIF PRM_CHOICE =2 THEN
OPEN EMPCURSOR FOR SELECT * FROM EMP WHERE DEPTNO = 20;
ELSIF PRM_CHOICE =3 THEN
OPEN EMPCURSOR FOR SELECT * FROM EMP WHERE DEPTNO = 30;
ELSE
OPEN EMPCURSOR FOR SELECT * FROM EMP;
END IF;
RETURN EMPCURSOR;
END;
3)編寫一個PLSQL塊,調用上面的FUNCTION獲得返回的遊標變量
[sql]
DECLARE
EMPCURSOR SYS_REFCURSOR;
REC_EMP EMP%ROWTYPE;
BEGIN
EMPCURSOR := GETEMPCURSOR(10);
IF EMPCURSOR%ISOPEN THEN
LOOP
FETCH EMPCURSOR INTO REC_EMP;
EXIT WHEN EMPCURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(''||'==>'||REC_EMP.ENAME);
END LOOP;
END IF;
CLOSE EMPCURSOR;
END;
4)幾點說明:
①有三種語句能夠控制遊標變量的使用,分別是OPEN FOR、FETCH還有CLOSE。其中OPEN用於打開遊標變量。FETCH用於將遊標變量中的數據存放到變量當中存儲。CLOSE用於在遍歷完成以後,關閉遊標。
②使用遊標的時候,能夠將REF CURSOR指定爲強類型或者弱類型(在定義的後面增長RETURN ROWTYPE的方式),若是指定爲強類型,當心避免出現類型不匹配的錯誤。
③遊標變量能夠在應用於數據庫服務器之間進行傳遞,能夠在數據庫內部進行傳遞。應用或者數據庫自己不具有單獨的變量存儲空間,其遊標變量其實就是一個指向內存的指針,實質上這些數據是共享的。
④可以將遊標的四個屬性%FOUND,%NOTFOUND,%ISOPEN以及%ROWCOUNT應用到遊標變量中,用於判斷遊標變量的狀態。
⑤能夠使用FETCH一次獲取一條記錄,也能夠使用FETCH BULK COLLECT INTO 一次獲取一條或者多條放到一個或者多個集合類型中。
⑥不要忘記關閉遊標。
ibatis call
<resultMap type="********.AdvNushiMikomiInputExcelOutPutDto" id="advNushiMikomiInputExcelOutPutDto">
</resultMap>
<select id="selectAdvNushiMikomiInputExcelSumiNetMokoCursor" parameterType="map" statementType="CALLABLE">
<![CDATA[
{#{resultList, mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=advNushiMikomiInputExcelOutPutDto} = call GETSUMIMOKOCURSOR(
#{v_nengetsu,jdbcType=CHAR,mode=IN},
#{v_uriageBuKaCode,jdbcType=CHAR,mode=IN},
#{v_tantoBuKaCode,jdbcType=CHAR,mode=IN},
#{v_gyosyuMcode,jdbcType=CHAR,mode=IN},
#{v_advNushiCode,jdbcType=CHAR,mode=IN}
)}
]]>
</select>
接口
advNushiMikomiInputDao.selectAdvNushiMikomiInputExcelSumiNetMokoCursor(map); List<AdvNushiMikomiInputExcelOutPutDto> advNushiMikomiInputExcelSumiNetMoko = (List<AdvNushiMikomiInputExcelOutPutDto>)map.get("resultList");