包定義:
create or replace package materialmanage is
type t_cursor is ref cursor;
procedure per_quickpage
(
tbname in varchar2, --表名
fieldstr in varchar2, --字段集
rowfilter in varchar2, --過濾條件
sortstr in varchar2, --排序集
rownumfieldstr in varchar2, --分頁條件
totalcount out number, --總記錄數(shù)
cur_returncur out t_cursor --返回的游標(biāo)
);
end materialmanage;
包主體:
create or replace package body materialmanage is
procedure per_quickpage
(
tbname in varchar2, --表 名
fieldstr in varchar2, --字段集
rowfilter in varchar2, --過濾條件
sortstr in varchar2, --排序集
minrownum in number, --分頁小值
maxrownum in number, --分頁大值
totalcount out number, --總記錄數(shù)
cur_returncur out t_cursor
)
is
v_sourcetb1 varchar2(3000); --動(dòng)態(tài)表名1
v_sourcetb2 varchar2(3000); --動(dòng)態(tài)表名2
v_sourcetb3 varchar2(3000); --動(dòng)態(tài)表名3
v_sourcetb4 varchar2(3000); --動(dòng)態(tài)表名4
v_totalcount varchar2(50); --總記錄數(shù)
v_sql varchar2(3000); --動(dòng)態(tài)sql
begin
v_sourcetb1 := '(select '|| fieldstr ||' from '|| tbname ||') sourcetb1';
v_sourcetb2 := '(select * from '|| v_sourcetb1 ||' where '|| rowfilter ||' '|| sortstr ||') sourcetb2';
v_sourcetb3 := '(select rownum as rowindex,sourcetb2.* from '|| v_sourcetb2 ||' where rownum<='|| maxrownum ||') sourcetb3';
v_sourcetb4 := '(select * from '|| v_sourcetb1 ||' where '|| rowfilter ||') sourcetb4';
v_sql := 'select count(*) as totalcount from '|| v_sourcetb4;
execute immediate v_sql into v_totalcount;
totalcount := v_totalcount;
v_sql := 'select * from '|| v_sourcetb3 ||' where rowindex >='||minrownum;
open cur_returncur for v_sql;
end per_quickpage;
end materialmanage;
由于oracle有個(gè)rownum特性,所以分頁的時(shí)候就是利用rownum來實(shí)現(xiàn)。如果大家還有什么更好的辦法記得告訴我一聲,多謝了,因?yàn)槲覝y試了上面的分頁方法效率并不是很高。
存儲(chǔ)過程返回了兩個(gè)參數(shù):totalcount :當(dāng)前條件下的總記錄數(shù) cur_returncur :游標(biāo)類型,就是所要讀取的記錄的集合
下面是asp.net中調(diào)用的代碼:
/// <summary>
/// 調(diào)用存儲(chǔ)過程實(shí)現(xiàn)快速分頁
/// </summary>
/// <param name="tbname">表名稱</param>
/// <param name="fieldstr">字段名稱</param>
/// <param name="rowfilter">過濾條件</param>
/// <param name="sortstr">排序字段</param>
/// <param name="minpagenum">分頁小值</param>
/// <param name="maxpagenum">分頁大值</param>
/// <param name="totalcount">總記錄(需要返回)</param>
/// <returns>datatable</returns>
public datatable quickpage(string tbname,string fieldstr,string rowfilter,string sortstr,int minrownum,int maxrownum,ref int recordcount)
{
oracleconnection conn = new oracleconnection(configurationsettings.appsettings["oracleconnstr"].tostring());
oraclecommand cmd = new oraclecommand();
cmd.connection = conn;
cmd.commandtext = "materialmanage.per_quickpage";
cmd.commandtype = commandtype.storedprocedure;
cmd.parameters.add("tbname",oracletype.varchar,50); //表 名
cmd.parameters["tbname"].direction = parameterdirection.input;
cmd.parameters["tbname"].value = tbname;
cmd.parameters.add("fieldstr",oracletype.varchar,3000); //字段集
cmd.parameters["fieldstr"].direction = parameterdirection.input;
cmd.parameters["fieldstr"].value = fieldstr;
cmd.parameters.add("rowfilter",oracletype.varchar,3000); //過濾條件
cmd.parameters["rowfilter"].direction = parameterdirection.input;
cmd.parameters["rowfilter"].value = rowfilter;
cmd.parameters.add("sortstr",oracletype.varchar,3000); //排序字段
cmd.parameters["sortstr"].direction = parameterdirection.input;
cmd.parameters["sortstr"].value = sortstr;
cmd.parameters.add("minrownum",oracletype.number); //分頁小值
cmd.parameters["minrownum"].direction = parameterdirection.input;
cmd.parameters["minrownum"].value = minrownum;
cmd.parameters.add("maxrownum",oracletype.number); //分頁大值
cmd.parameters["maxrownum"].direction = parameterdirection.input;
cmd.parameters["maxrownum"].value = maxrownum;
cmd.parameters.add("totalcount",oracletype.number); //頁總記錄數(shù)
cmd.parameters["totalcount"].direction = parameterdirection.output;
cmd.parameters["totalcount"].value = 0;
cmd.parameters.add("cur_returncur",oracletype.cursor); //返回的游標(biāo)
cmd.parameters["cur_returncur"].direction = parameterdirection.output;
dataset ds = new dataset();
oracledataadapter adapter= new oracledataadapter(cmd);
adapter.fill(ds);
conn.close();
//總記錄數(shù)
recordcount = int.parse(cmd.parameters["totalcount"].value.tostring());
return ds.tables[0];
}
好了,代碼都羅列到上面了,至于用,大家應(yīng)該知道了吧
新聞熱點(diǎn)
疑難解答
圖片精選