最近開始在項目中使用oracle數據庫,針對項目中的大數據量搜索效率變得奇慢無比,學習采用分頁方式來解決,綜合網上的資料最終搞定。
oracle存儲過程需要寫在包里,代碼如下:
包定義:
![]()
Code
CREATE OR REPLACE PACKAGE DotNet is
-- ****************************************************************
TYPE type_cur IS REF CURSOR ; -- 定義游標變量用于返回記錄集
PROCEDURE DotNetPagination
(
Pindex in number , -- 分頁索引
Psql in varchar2 , -- 產生dataset的sql語句
Psize in number , -- 頁面大小
Pcount out number , -- 返回分頁總數
v_cur out type_cur -- 返回當前頁數據記錄
);
procedure DotNetPageRecordsCount
(
Psqlcount in varchar2 , -- 產生dataset的sql語句
Prcount out number -- 返回記錄總數
);
end DotNet;
-- ****************************************************************
-- ***************************************************************************************
PROCEDURE DotNetPagination
(
Pindex in number ,
Psql in varchar2 ,
Psize in number ,
Pcount out number ,
v_cur out type_cur
)
AS
v_sql VARCHAR2 ( 1000 );
v_count number ;
v_Plow number ;
v_Phei number ;
Begin
-- ----------------------------------------------------------取分頁總數
v_sql : = ' select count(*) from ( ' || Psql || ' ) ' ;
execute immediate v_sql into v_count;
Pcount : = ceil(v_count / Psize);
-- ----------------------------------------------------------顯示任意頁內容
v_Phei : = Pindex * Psize + Psize;
v_Plow : = v_Phei - Psize + 1 ;
-- Psql := 'select rownum rn,t.* from cd_ssxl t' ; --要求必須包含rownum字段
-- v_sql := 'select * from (' || Psql || ') where rn between ' || v_Plow || ' and ' || v_Phei ;
v_sql : = ' SELECT *
FROM (
SELECT A.*, rownum rn
FROM ( ' || Psql || ' ) A
WHERE rownum <= ' || to_char(v_Phei) || '
) B
WHERE rn >= ' || to_char(v_Plow) ;
-- 注意對rownum別名的使用,第一次直接用rownum,第二次一定要用別名rn
open v_cur for v_sql;
End DotNetPagination;
-- **************************************************************************************
procedure DotNetPageRecordsCount
(
Psqlcount in varchar2 ,
Prcount out number
)
as
v_sql varchar2 ( 1000 );
v_prcount number ;
begin
v_sql : = ' select count(*) from ( ' || Psqlcount || ' ) ' ;
execute immediate v_sql into v_prcount;
Prcount : = v_prcount; -- 返回記錄總數
end DotNetPageRecordsCount;
-- **************************************************************************************
end DotNet;
![]()
Code
CREATE OR REPLACE PACKAGE Body DotNet is
-- ***************************************************************************************
PROCEDURE DotNetPagination
(
Pindex in number ,
Psql in varchar2 ,
Psize in number ,
Pcount out number ,
v_cur out type_cur
)
AS
v_sql VARCHAR2 ( 1000 );
v_count number ;
v_Plow number ;
v_Phei number ;
Begin
-- ----------------------------------------------------------取分頁總數
v_sql : = ' select count(*) from ( ' || Psql || ' ) ' ;
execute immediate v_sql into v_count;
Pcount : = ceil(v_count / Psize);
-- ----------------------------------------------------------顯示任意頁內容
v_Phei : = Pindex * Psize + Psize;
v_Plow : = v_Phei - Psize + 1 ;
v_sql : = ' SELECT *
FROM (
SELECT A.*, rownum rn
FROM ( ' || Psql || ' ) A
WHERE rownum <= ' || to_char(v_Phei) || '
) B
WHERE rn >= ' || to_char(v_Plow) ;
-- 注意對rownum別名的使用,第一次直接用rownum,第二次一定要用別名rn
open v_cur for v_sql;
End DotNetPagination;
-- **************************************************************************************
procedure DotNetPageRecordsCount
(
Psqlcount in varchar2 ,
Prcount out number
)
as
v_sql varchar2 ( 1000 );
v_prcount number ;
begin
v_sql : = ' select count(*) from ( ' || Psqlcount || ' ) ' ;
execute immediate v_sql into v_prcount;
Prcount : = v_prcount; -- 返回記錄總數
end DotNetPageRecordsCount;
-- **************************************************************************************
end DotNet;
實際運用發現查詢的速度還是不快(因為我的查詢時聯合4個表,其中還有圖片表),所以仍在考慮怎么對性能調優,下一步再總結。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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