很多時(shí)候,我們想通過存儲過程獲得一個(gè)輸出集。我們知道sql server的存儲過程在執(zhí)行之后,返回的就是一個(gè)集合。但是oracle如果要獲得一個(gè)輸出集合,就要麻煩一點(diǎn)了。
?????? procedure getPaged(pageSize in number,pageIndex in number,totalPage out number,csr out forPaged.my_csr);
end forPaged;
? ? ?oracle獲得輸出集合是通過游標(biāo)實(shí)現(xiàn)的,而且游標(biāo)需要在package中進(jìn)行聲明。下面就拿分頁的存儲過程為例。
? ? ?首先,先創(chuàng)建一個(gè)包package,類似于C#中的接口,只用于申明,沒有任何實(shí)際的代碼。
? ??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;
其實(shí)包里面就是一個(gè)游標(biāo)的申明和這個(gè)包包含的存儲過程。游標(biāo)的申明在這里很像C#中輸出參數(shù)類型的申明。
? ? ?第二步,就是實(shí)現(xiàn)剛才包中申明的存儲過程。
? ? ?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;
?
? ? ?第三步,進(jìn)行測試。如果我們想直接在PL/SQL Developer中進(jìn)行測試,直接在存儲過程名稱處右鍵,選擇test,在跳出的頁面下面輸入?yún)?shù)的值就行了。之前不知道這樣就可以進(jìn)行測試,所以自己又寫了一段測試代碼,由于水平不高,寫出來之后還是錯(cuò)的,如果有哪位寫過類似的代碼,還請分享一下。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
