ORACLE 自定义分页存储过程
一、创建包
CREATE OR REPLACE PACKAGE PKG_JK_LAB_BASIC IS TYPE CURSOR_TYPE IS REF CURSOR; PROCEDURE SP_GET_PAGINATION ( pi_tableName in varchar2, --表名 pi_where in varchar2, --查询条件 pi_columns in varchar2, --查询列集合 pi_orderColumn in varchar2, --排序的列 pio_curPage in out Number, --当前页 pio_pageSize in out Number, --每页显示记录条数 po_totalRecords out Number, --总记录数 po_totalPages out Number, --总页数 po_cur out CURSOR_TYPE); END PKG_JK_LAB_BASIC;
二、创建包体
CREATE OR REPLACE PACKAGE BODY PKG_JK_LAB_BASIC IS PROCEDURE SP_GET_PAGINATION (pi_tableName in varchar2, --表名 pi_where in varchar2, --查询条件 pi_columns in varchar2, --查询列集合 pi_orderColumn in varchar2, --排序的列 pio_curPage in out Number, --当前页 pio_pageSize in out Number, --每页显示记录条数 po_totalRecords out Number, --总记录数 po_totalPages out Number, --总页数 po_cur out CURSOR_TYPE) --返回的结果集 IS v_sql VARCHAR2(1000) := ''; --sql语句 v_startRecord Number(4); --开始显示的记录条数 v_endRecord Number(4); --结束显示的记录条数 v_where VARCHAR2(500) := ''; v_orderColumn VARCHAR2(200) := ''; v_columns VARCHAR2(200) := ''; BEGIN --记录中总记录条数 v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || pi_tableName; v_where := TRIM(NVL(pi_where,'')); IF LENGTH(v_where)>0 THEN v_where := ' WHERE ' || pi_where || ' '; v_sql := v_sql || v_where; END IF; v_orderColumn := TRIM(NVL(pi_orderColumn,'')); IF LENGTH(v_orderColumn)>0 THEN v_orderColumn := ' ORDER BY ' || v_orderColumn || ' '; END IF; EXECUTE IMMEDIATE v_sql INTO po_totalRecords; IF pio_pageSize <= 0 THEN pio_pageSize := 10; END IF; --根据页大小计算总页数 po_totalPages := CEIL( po_totalRecords / pio_pageSize); IF pio_curPage < 1 THEN pio_curPage := 1; END IF; IF pio_curPage > po_totalPages THEN pio_curPage := po_totalPages; END IF; --实现分页查询 v_startRecord := (pio_curPage - 1) * pio_pageSize + 1; v_endRecord := pio_curPage * pio_pageSize; v_columns := TRIM(NVL(pi_columns,'')); IF LENGTH(v_columns)>0 AND v_columns <> '*' THEN v_sql := 'SELECT * FROM (SELECT '|| v_columns ||', ROWNUM RowNumber FROM ' || '(SELECT '|| v_columns ||' FROM ' || pi_tableName || v_where || v_orderColumn || '))'|| ' WHERE RowNumber <= ' || v_endRecord || ' AND RowNumber >= ' || v_startRecord ; ELSE v_sql := 'SELECT * FROM (SELECT A.*, ROWNUM RowNumber FROM ' || '(SELECT * FROM ' || pi_tableName || v_where || v_orderColumn || ') A )'|| ' WHERE RowNumber <= ' || v_endRecord || ' AND RowNumber >= ' || v_startRecord ; END IF; DBMS_OUTPUT.put_line(v_sql); OPEN po_cur FOR v_sql; END SP_GET_PAGINATION; END PKG_JK_LAB_BASIC;
分类:
[11]Oracle
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库