一般比较通用的分页写法: SELECT * FROM ( SELECT row_.*, rownum rownum_ FROM ( //生成标准的查询语句(没有分页条件的) Sql_statement ) row_ WHERE rownum <= pageSize * pageNumber ) WHERE rownum_ > pageSize * (pageNumber - 1))
create or replace procedure proc_paging (table_name in varchar2 ,select_clause in varchar2 ,where_clause in varchar2 ,order_clause in varchar2 ,start_row in number ,end_row in number ,result in out sys_refcursor ) as stmt varchar2(2000); begin stmt := 'select ' || select_clause || chr(10) || 'from ' || table_name || chr(10); if where_clause is not null then stmt := stmt || 'where ' || where_clause || chr(10); end if; if order_clause is not null then stmt := stmt || 'order by ' || order_clause; end if;
SELECT * FROM
( SELECT row_.*, rownum rownum_ FROM ( //生成标准的查询语句(没有分页条件的)
Sql_statement
) row_ WHERE rownum <= pageSize * pageNumber ) WHERE rownum_ > pageSize * (pageNumber - 1))
create or replace procedure proc_paging
(table_name in varchar2
,select_clause in varchar2
,where_clause in varchar2
,order_clause in varchar2
,start_row in number
,end_row in number
,result in out sys_refcursor
) as
stmt varchar2(2000);
begin
stmt := 'select ' || select_clause || chr(10) ||
'from ' || table_name || chr(10);
if where_clause is not null then
stmt := stmt || 'where ' || where_clause || chr(10);
end if;
if order_clause is not null then
stmt := stmt || 'order by ' || order_clause;
end if;
stmt := 'select ' || select_clause || ',rownum rn' || chr(10) ||
'from (' || stmt || ')';
stmt := 'select rn,' || select_clause || chr(10) ||
'from (' || stmt || ') where rn between ' || start_row || ' and ' || end_row;
dbms_output.put_line(stmt);
open result for stmt;
end;-- 測試
variable v refcursor;
execute proc_paging('employees', 'employee_id,first_name,salary', null, 'salary desc', 6, 10, :v);
print v;-- 結果
RN EMPLOYEE_ID FIRST_NAME SALARY
---------- ----------- ------------------------------ ----------
6 147 Alberto 12000
7 100 Steven 12000
8 108 Nancy 12000
9 205 Shelley 12000
10 168 Lisa 11500