zoukankan      html  css  js  c++  java
  • oracle:储存过程实现分页

      1 CREATE OR REPLACE PACKAGE PKG_QUERY IS
      2 
      3 
      4 
      5   -- Author  : ADMINISTRATOR
      6   -- Created : 2016/12/8 星期四 10:28:37
      7   -- Purpose : 用做查询游标
      8 
      9 
     10   -- Public type declarations
     11   TYPE CUR_QUERY IS REF CURSOR;
     12 
     13 
     14 END PKG_QUERY;
     15 
     16 
     17 
     18 
     19 CREATE OR REPLACE PROCEDURE prc_query
     20        (p_tableName        in  varchar2,   --表名
     21         p_strWhere         in  varchar2,   --查询条件
     22         p_child_query      in  varchar2,   --子查询
     23         p_orderColumn      in  varchar2,   --排序的列
     24         p_orderStyle       in  varchar2,   --排序方式
     25         p_curPage          in out Number,  --当前页
     26         p_pageSize         in out Number,  --每页显示记录条数
     27         p_totalRecords     out Number,     --总记录数
     28         p_totalPages       out Number,     --总页数
     29         v_cur              out pkg_query.cur_query)   --返回的结果集
     30 IS
     31    v_sql VARCHAR2(4000) := '';      --sql语句
     32    v_startRecord Number(7);         --开始显示的记录条数
     33    v_endRecord Number(7);           --结束显示的记录条数
     34 BEGIN
     35    --记录中总记录条数
     36    v_sql := 'SELECT TO_NUMBER(COUNT(*)) FROM ' || p_tableName || ' WHERE 1=1';
     37    IF p_strWhere IS NOT NULL  THEN
     38        v_sql := v_sql || p_strWhere;
     39    END IF;
     40    dbms_output.put_line(v_sql);
     41    EXECUTE IMMEDIATE v_sql INTO p_totalRecords;
     42    p_totalPages := 0;
     43 --   if p_totalRecords <> 0 then
     44 
     45 
     46      --验证页面记录大小
     47      IF p_pageSize < 0 THEN
     48          p_pageSize := 0;
     49      END IF;
     50 
     51 
     52      --根据页大小计算总页数
     53      IF MOD(p_totalRecords,p_pageSize) = 0 THEN
     54          p_totalPages := floor(p_totalRecords / p_pageSize);
     55      ELSE
     56          p_totalPages := floor(p_totalRecords / p_pageSize) + 1;
     57      END IF;
     58 
     59 
     60 
     61 
     62 
     63 
     64      --实现分页查询
     65      v_startRecord := (p_curPage - 1) * p_pageSize + 1;
     66      v_endRecord := p_curPage * p_pageSize;
     67      v_sql := 'SELECT b.*,' || p_child_query || ' FROM (SELECT A.*, rownum r FROM ' ||
     68               '(SELECT * FROM ' || p_tableName;
     69      IF p_strWhere IS NOT NULL  THEN
     70          v_sql := v_sql || ' WHERE 1=1 ' || p_strWhere;
     71      END IF;
     72      IF p_orderColumn IS NOT NULL THEN
     73          v_sql := v_sql || ' ORDER BY ' || p_orderColumn || ' ' || p_orderStyle;
     74      END IF;
     75      v_sql := v_sql || ') A WHERE rownum <= ' || v_endRecord || ') B WHERE r >= '
     76               || v_startRecord;
     77      DBMS_OUTPUT.put_line(v_sql);
     78      OPEN v_cur FOR v_sql;
     79 --  end if;
     80 
     81 
     82 END prc_query;
  • 相关阅读:
    项目总结
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    个人博客
    浅谈Vue与swiper轮播图框架结合小案例
  • 原文地址:https://www.cnblogs.com/ios9/p/7472939.html
Copyright © 2011-2022 走看看