存儲過程使用游標變量返回結果集


存儲過程使用游標變量返回結果集

 

1)登錄SQLPLUS,用戶為SCOTT,利用該用戶提供的表EMP

[sql] 

C:/Users/Administrator>sqlplus scott/scott  

 

2)編寫一個FUNCTION,返回值為游標變量

 

[sql] 

CREATE OR REPLACE FUNCTION GETEMPCURSOR(PRM_CHOICE IN NUMBER)  

RETURN  SYS_REFCURSOR  

IS  

  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");


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM