悬赏分:50 浏览:222 次
|
oracle分页存储过程的思路于sqlserver的思路是一样的.
CREATE OR REPLACE PROCEDURE TABLEPAGE_SELECT(v_page_size int, --the size of a page of list
v_current_page int, --the current page of list
v_table_name varchar2, --the talbe name
v_order_field varchar2,--the order field
v_order_sequence varchar2,--the order sequence should by "_desc"or "_asc",_is blank.
--v_sql_select varchar2, --the select sql for procedure
--v_sql_count varchar2, --the count sql for procedure
--v_out_recordcount OUT int, --the num of return rows
p_cursor OUT refcursor_pkg.return_cursor) as
v_sql varchar2(3000); --the sql for select all rows of list
v_sql_count varchar2(3000); --the count sql for procedure
v_sql_order varchar2(2000); --the order of list
v_count int; -- the amount rows fo original list
v_endrownum int; --the end row num of the current page
v_startrownum int; --the start row num of the current page
BEGIN
----set the order of list
if v_order_field!='NO' then
v_sql_order :=' ORDER BY '|| v_order_field ||' '||v_order_sequence;
else
v_sql_order :='';
end if;
----catch the amount rows of list
v_sql_count:='SELECT COUNT(ROWNUM) FROM '||v_table_name;
execute immediate v_sql_count into v_count;
-- v_out_recordcount := v_count;
----set the value of start and end row
if v_order_sequence='desc' then
v_endrownum:=v_count-(v_current_page-1)*v_page_size;
v_startrownum:=v_endrownum - v_page_size + 1;
else
v_endrownum:= v_current_page * v_page_size;
v_startrownum := v_endrownum - v_page_size + 1;
end if;
----the sql for page slide
v_sql := 'SELECT * FROM (SELECT '||v_table_name||'.*, rownum rn FROM '||v_table_name||' WHERE rownum <= ' ||
to_char(v_endrownum) ||' '|| v_sql_order||') WHERE rn >= ' ||
to_char(v_startrow 我正在使用的,供您参考 create or replace procedure sp_select ( tblName nvarchar2, -- 表名 doCount number := 0, -- 返回记录总数, 0 False 默认返回具体的记录, 非 0 True 返回记录的总数 strGetFields nvarchar2 := '*',-- 需要返回的列 默认返回全部列 OrderField nvarchar2 := ' ', -- 排序的字段名 OrderType number := 0, -- 设置排序类型, 0 False 默认升序, 非 0 True 降序 strWhere nvarchar2 := ' ', -- 查询条件 (注意: 不要加 where) 默认为空 PageSize number := 10, -- 页尺寸 默认为10条 PageIndex number := 1, -- 页码 默认为第1页 mycs out sys_refcursor ) as strSQL varchar2(32767); -- 主语句 strTmp varchar2(100); -- 临时变量 strOrder varchar2(100); -- 排序类型 begin if doCount != 0 then --如果@doCount传递过来的不是0,就执行总数统计 begin if strWhere != ' ' then strSQL := 'select count(1) as Total from '||tblName||' where '||strWhere ; else strSQL := 'select count(1) as Total from '||tblName ; end if; end; else --以下的所有代码都是doCount为0 的情况,即要求返回具体的记录 begin if OrderType != 0 then --如果OrderType不是0,就执行降序。 begin strTmp := '<(select min'; strOrder := ' order by '||OrderField||' desc' ; end; else begin strTmp := '>(select max' ; strOrder := ' order by '||OrderField||' asc' ; end; end if; if PageIndex = 1 then --如果是第一页就执行以下代码,这样会加快执行速度。 begin if strWhere != ' ' then strSQL := 'select * from (select '||strGetFields|| ' from '||tblName ||' where ('||strWhere || ') '||strOrder ||') where rownum<='||PageSize; else strSQL := 'select * from (select '||strGetFields|| ' from '||tblName ||' '||strOrder||') where rownum<='||PageSize ; end if; end; else --如果不是第一页,就要加上取数的条件。 begin if strWhere != ' ' then strSQL := 'select * from (select '|| strGetFields || ' from '||tblName||' where '||OrderField||' '||strTmp||'('||OrderField||') from (select * from (select '||OrderField||' |