Oracle塊編程返回結果集詳解

來源:互聯網
上載者:User

一、概述

在Oracle塊編程(begin系列)中,由於其不支援select .... from ...返回結果集的形式,因此就只能通過輸出參數的形式返回結果。遊標作為一種將結果集封裝成以指標單調向下讀取資料的結構,類似於只有出隊並刪除操作的隊列,正好作為輸出參數的類型。而為了使用這種方式,必須保證預存程序的參數在聲明與調用時的統一,因此不得不使用程式包。所以程式包+遊標+預存程序或函數就成了塊編程返回結果集的方法。下面來談pl/sql與ODP.net實現的方法。

二、定義

1、表結構

  create table Grade
  (
      GradeId,number,
      GradeName varchar2(20)
  )

2、塊編程

--定義程式包規範
create package Grades is
    type Result is ref cursor;
    procedure FenYe_Grade(p_PageSize in number,p_PageIndex in number,p_Result out Result);
end Grades;
--定義程式包體
create package body Grades is
  procedure FenYe_Grade(p_PageSize in number,p_PageIndex in number,p_Result out Result) is
  begin
      open p_Result for select GradeId,GradeName
      from (select GradeId,GradeName,rownum rn from Grade where rownum<=p_Page*p_PageSize) a
      where rn>p_PageSize*(p_Page-1);
  end FenYe_

既然談到了rownum,那就來詳細說說,rownum是讀取資料時的順序號,記得"讀取資料時的順序號",任何讀取都算。就好像把所有資料放入  一個房間,門口有一個塗編號的機器(起始號為1,遞增量為1),房間裡出來一個,該機器就在它身上塗上一個數字,機器塗號不能被打斷,一被打斷,又從1開始。因為它一被打斷就從1開始,所以rownum>n或rownum=n (n>1)總是為false的,根據這個比喻,用rownum>2來說:首先第一個出來為1,不滿足篩選條件,拋棄掉,此時塗號器被打斷,從1開始,於是第二個又是1,如此迴圈下去,所有的數都是1.再拿上面代碼執行個體“where rn>p_pageSize*(p_Page-1)”來說,討論其一種情況:

a、改為"where rownum>p_pageSize*(p_Page-1)"

這樣改後,結果一定是空的,為什麼呢?用rownum判斷就意味著又要對a結果集重新編號了,根據上面的推論,結果一定是空的。那用rn為什麼又可以呢?rn是a結果集rownum的別名,當把rownum用別名輸出後,就等於rownum物化了,已經作為結果集的一列,因此用rn判斷時就不要重新編號了

更多詳情見請繼續閱讀下一頁的精彩內容:

Oralce中返回結果集的預存程序ref cursor 

JDBC 調用Oracle預存程序返回結果集並獲得輸出參數

  • 1
  • 2
  • 下一頁

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.