撰写过程:网上搜集测试了好多的Oracle分页存储过程代码,经整理后终于通过测试,特分享给大家

测试步骤:1、运行创建包命令;2、运行创建存储过程命令;3、运行调用分页存储过程语句

测试环境:windows2003+Oracle11g+PLSQL Developer

--1、创建包命令

create or replace package mypackage as
  type cursor_page is ref cursor;
  Procedure myprocdure(
             p_TableName varchar2,              --表名
             p_Fields varchar2,                 --查询列
             p_Orderby varchar2,                --排序
             p_Where varchar2,                  --查询条件
             p_pagesize Number,                 --每页大小
             p_pageIndex Number,                --当前页
             p_rowcount out Number,             --总条数,输出参数
             p_pagecount out number,            --总页数
             p_cursor out cursor_page);         --结果集
end mypackage;

--2、创建存储过程命令

CREATE OR REPLACE Package Body mypackage
Is
       --存储过程
      Procedure myprocdure(
             p_TableName varchar2,              --表名
             p_Fields varchar2,                 --查询列
             p_Orderby varchar2,                --排序
             p_Where varchar2,                  --查询条件
             p_pagesize Number,                 --每页大小
             p_pageIndex Number,                --当前页
             p_rowcount out Number,             --总条数,输出参数
             p_pagecount out number,            --总页数
             p_cursor out cursor_page           --结果集
      )
      is
            v_count_sql varchar2(2000);

v_select_sql varchar2(2000);

s_TableName nvarchar2(255);--分页表名

begin
            --查询总条数
            v_count_sql:='select count(*) from '||p_TableName;
            --连接查询条件(''也属于is null)
            if p_Where is not null  then
               v_count_sql:=v_count_sql||' where '||p_Where;
            end if;
            --执行查询,查询总条数
            execute immediate v_count_sql into p_rowcount;

            --dbms_output.put_line('查询总条数SQL=>'||v_count_sql);
            --dbms_output.put_line('查询总条数Count='||p_rowcount);

             --得到总页数
             if mod(p_rowcount,p_pagesize)=0 then
                p_pagecount:=p_rowcount/p_pagesize;
             else
                p_pagecount:=p_rowcount/p_pagesize+1;
             end if;

            --如果查询记录大于0则查询结果集
            if p_rowcount>0 and p_pageIndex>=1 and p_pageIndex<=p_pagecount then

               --查询所有(只有一页)
               if p_rowcount<=p_pagesize then
                  v_select_sql:='select '||p_Fields||' from '||p_TableName;
                  if p_Where is not null then
                     v_select_sql:=v_select_sql||' where '||p_Where;
                  end if;
                  if p_Orderby is not null then
                      v_select_sql:=v_select_sql||' order by '||p_Orderby;
                  end if;
               elsif p_pageIndex=1 then  --查询第一页
                  v_select_sql:='select '||p_Fields||' from '||p_TableName;
                  if p_Where is not null then
                     v_select_sql:=v_select_sql||' where '||p_Where||' and rownum<='||p_pagesize;
                  else
                     v_select_sql:=v_select_sql||' where rownum<='||p_pagesize;
                  end if;
                  if p_Orderby is not null then
                      v_select_sql:=v_select_sql||' order by '||p_Orderby;
                  end if;
               else      --查询指定页

if instr(p_TableName,')')>0 then                  
                  s_TableName:=replace(substr(p_TableName,instr(p_TableName,')')+1),' ','');
                  v_select_sql:='select * from (select '||s_TableName||'.' || p_Fields ||',rownum row_num from '|| p_TableName;
                  else
                  v_select_sql:='select * from (select '|| p_TableName || '.' || p_Fields ||',rownum row_num from '|| p_TableName;
                  end if;

if p_Where is not null then
                     v_select_sql:=v_select_sql||' where '||p_Where;
                  end if;
                  if p_Orderby is not null then
                      v_select_sql:=v_select_sql||' order by '||p_Orderby;
                  end if;
                  v_select_sql:=v_select_sql||') where row_num>'||((p_pageIndex-1)*p_pagesize)||' and row_num<='||(p_pageIndex*p_pagesize);
               end if;
               --执行查询
               --dbms_output.put_line('查询语句=>'||v_select_sql);
               open p_cursor for v_select_sql;
            else
               --dbms_output.put_line('查询语句=>'||'select * from '||p_TableName||' where 1!=1');
               open p_cursor for 'select * from '||p_TableName||' where 1!=1';
            end if;

      end myprocdure;
end mypackage;

--3、调用分页存储过程语句
declare
       p_TableName varchar2(2000);
       p_Fields varchar2(2000);
       p_Orderby varchar2(200);
       p_Where varchar2(200);
       p_pagesize Number;
       p_pageIndex Number;
       p_rowcount Number;
       p_pagecount number;
       p_cursor mypackage.cursor_page ;
begin   
        p_TableName:='GOODSDOC';
        p_Fields:='*';
        p_Orderby:='GOODSNAME';
        p_Where:='1=1';
        p_pagesize:=100;
        p_pageIndex:=1;
        mypackage.myprocdure(p_TableName,p_Fields,p_Orderby,p_Where,p_pagesize,p_pageIndex,p_rowcount,p_pagecount,p_cursor);      
        DBMS_OUTPUT.PUT_LINE('记录总数'||p_rowcount||'页面总数'||p_pagecount);
END;

Oracle分页存储过程及PLSQL中的调用脚本的更多相关文章

  1. Oracle 在存储过程或函数中执行字符串sql

    有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTION CALCULATE_TARGET_SCORE (CUR ...

  2. java调用Oracle分页存储过程

    Java程序 package com.test; import java.sql.CallableStatement; import java.sql.Connection; import java. ...

  3. java 调用oracle 分页存储过程 返回游标数据集

    1.分页类 package org.zh.basic; /** * 页面类 * * @author keven * */ public class PageInfo { // 定义 private S ...

  4. Oracle分页存储过程

    1.在oracle的sqlplus或其他工具中运行一下pl/sql块建立存储过程 --创建包create or replace package testpackage astype test_curs ...

  5. oracle 在存储过程或函数中得到异常sql

    BEGIN SQLSTR := 'UPDATE TBL ...'; EXECUTE IMMEDIATE SQLSTR; EXCEPTION WHEN OTHERS INSERT INTO LOG_TA ...

  6. Oracle 分页方法研究

    1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...

  7. 懵懂oracle之存储过程3--JOB详解

    在前面学习了存储过程的开发.调试之后,我们现在就需要来使用存储过程了.简单的使用,像上篇<懵懂oracle之存储过程2>中提到的存储过程调用,我们可以将写好的存储过程在另一个PL/SQL块 ...

  8. SQL Server的通用分页存储过程 未使用游标,速度更快!

    经过一个下午的时间,和我一个同事(绝对是高手)的共同努力下,摸索出了以下的思路: 1.确定存储的输入参数: 1)SQL脚本,该参数接收完整的.正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入 ...

  9. Oracle存储过程中异步调用的实际操作步骤

    本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用  .而有些相关的业务逻辑 ...

随机推荐

  1. 原生js移动端列表无缝间歇向上滚动

    在项目开发中尤其是在项目的活动页面的开发中,经常需要将用户的购买信息或中奖信息等以列表的形式展示在页面当中,并可以使其自动间歇向上滚动来达到在有限的区域内展示所有信息的目的.通常的做法是通过将列表父元 ...

  2. gdb调试的基本使用

    GDB调试 启动程序准备调试 GDB yourpram 或者 先输入GDB 然后输入 file yourpram 然后使用run或者r命令开始程序的执行,也可以使用 run parameter将参数传 ...

  3. bootstrap table 和 x-editable 使用方法

    最近需要做一些数据表格,有同事推荐EasyUI,但经过比较还是选择了Bootstrap,一款极为强大的表格组件,基于Bootstrap 的 jQuery .本文还将介绍Bootstrap-editab ...

  4. PHP MySQL 插入数据

    PHP MySQL 插入数据 使用 MySQLi 和 PDO 向 MySQL 插入数据 在创建完数据库和表后,我们可以向表中添加数据. 以下为一些语法规则: PHP 中 SQL 查询语句必须使用引号 ...

  5. Python3 注释

    确保对模块, 函数, 方法和行内注释使用正确的风格 Python中的注释有单行注释和多行注释: Python中单行注释以#开头,例如: #!/usr/bin/python3 #coding=utf-8 ...

  6. Android RRO机制的运用-----google开机向导客制化

    上周五的时候领导分了一个任务,客户让在google开机向导里面增加一页,首先就想到了android的Overlay,然后网上搜了下,发下有很多人写了这方面的技术.而且写的都还不错,所以本篇只当记录作用 ...

  7. solr多集合配置

    1.1 多SolrCore配置 一个solr工程中可以配置多个SolrCore实例. 分享牛原创(尊重原创 转载对的时候第一行请注明,转载出处来自分享牛http://blog.csdn.net/qq_ ...

  8. logstash分析日志

    待处理日志格式如下: [totalCount: 298006556, count: 287347623, queryCount: 259027994, exeCount: 28319629, tota ...

  9. Swift中方法闭包参数不能省略括号的一种情况

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 我们知道在swift中,如果方法的最后一个参数是一个闭包类型, ...

  10. 小小聊天室 Python实现

    相对于Java方式的聊天室,Python同样可以做得到.而且可以做的更加的优雅.想必少了那么多的各种流的Python Socket,你一定会喜欢的. 至于知识点相关的内容,这里就不多说了. UDP方式 ...