很多時候,我們想通過存儲過程獲得一個輸出集。我們知道sql server的存儲過程在執行之后,返回的就是一個集合。但是oracle如果要獲得一個輸出集合,就要麻煩一點了。
procedure getPaged(pageSize in number,pageIndex in number,totalPage out number,csr out forPaged.my_csr);
end forPaged;
oracle獲得輸出集合是通過游標實現的,而且游標需要在package中進行聲明。下面就拿分頁的存儲過程為例。
首先,先創建一個包package,類似於C#中的接口,只用於申明,沒有任何實際的代碼。
create or replace package forPaged is
type my_csr is ref cursor;
procedure getPaged(pageSize in number,pageIndex in number,totalPage out number,csr out forPaged.my_csr);
end forPaged;
其實包里面就是一個游標的申明和這個包包含的存儲過程。游標的申明在這里很像C#中輸出參數類型的申明。
第二步,就是實現剛才包中申明的存儲過程。
create or replace procedure getPaged(pageSize in number,pageIndex in number,totalPage out number,csr forPaged.my_csr) is
begin
select count(*) into totalPage from orders;
totalPage := Ceil(totalPage*1.0/pageSzie);
open csr for
select * from (
select t.*,rownum rn from(
select * from orders order by Id desc
) t
where rownum >= (pageIndex - 1)*pageSzie +1
)
where t.rn < (pageIndex*pageSize + 1);
end getPaged;
第三步,進行測試。如果我們想直接在PL/SQL Developer中進行測試,直接在存儲過程名稱處右鍵,選擇test,在跳出的頁面下面輸入參數的值就行了。之前不知道這樣就可以進行測試,所以自己又寫了一段測試代碼,由於水平不高,寫出來之后還是錯的,如果有哪位寫過類似的代碼,還請分享一下。