CREATE OR REPLACE PACKAGE pkg_page AS TYPE cur_page IS REF CURSOR; PROCEDURE proc_page (p_tableName IN varchar2, --表名 p_strColumns IN varchar2, --查询的字段 p_strWhere IN varchar2, --查询条件 p_strOrder IN varchar2, --排序 p_pageIndex IN OUT Number, --索引页 p_pageSize IN OUT Number, --每页显示记录条数 p_totalRecords OUT Number, --总记录数 p_totalPages OUT Number, --总页数 cur_ret OUT pkg_page.cur_page); --返回的结果集 END pkg_page; CREATE OR REPLACE PACKAGE BODY pkg_page AS PROCEDURE proc_page (p_tableName IN varchar2, --表名 p_strColumns IN varchar2, --查询的字段 p_strWhere IN varchar2, --查询条件 p_strOrder IN varchar2, --排序 p_pageIndex IN OUT Number, --索引页 p_pageSize IN OUT Number, --每页显示记录条数 p_totalRecords OUT Number, --总记录数 p_totalPages OUT Number, --总页数 cur_ret OUT pkg_page.cur_page) --返回的结果集 IS v_sql VARCHAR2 (4000) := ''; --sql语句 v_startRecord Number (10); --开始显示的记录条数 v_endRecord Number (10); --结束显示的记录条数 BEGIN --记录中总记录条数 v_sql := 'SELECT COUNT(rownum) FROM ' || p_tableName || ' WHERE 1=1'; IF p_strWhere IS NOT NULL OR p_strWhere <> '' THEN v_sql := v_sql || p_strWhere; END IF; EXECUTE IMMEDIATE v_sql INTO p_totalRecords; --验证页面记录大小 IF p_pageSize < 0 THEN p_pageSize := 20; END IF; --根据页大小计算总页数[Page] IF MOD (p_totalRecords, p_pageSize) = 0 THEN p_totalPages := p_totalRecords / p_pageSize; ELSE p_totalPages := p_totalRecords / p_pageSize + 1; END IF; --验证页号 IF p_pageIndex < 1 THEN p_pageIndex := 1; END IF; IF p_pageIndex > p_totalPages THEN p_pageIndex := p_totalPages; END IF; --实现分页查询 v_startRecord := (p_pageIndex - 1) * p_pageSize + 1; v_endRecord := p_pageIndex * p_pageSize; v_sql := 'SELECT ' || p_strColumns || ' FROM (SELECT A.*, rownum r FROM ' || '(SELECT * FROM ' || p_tableName; IF p_strWhere IS NOT NULL OR p_strWhere <> '' THEN v_sql := v_sql || ' WHERE 1=1' || p_strWhere; END IF; IF p_strOrder IS NOT NULL OR p_strOrder <> '' THEN v_sql := v_sql || p_strOrder || ' '; END IF; v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= ' || v_startRecord; --DBMS_OUTPUT.put_line (v_sql); OPEN cur_ret FOR v_sql; END proc_page; END;