Oracle分页存储过程及PLSQL中的调用脚本
撰写过程:网上搜集测试了好多的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中的调用脚本的更多相关文章
- Oracle 在存储过程或函数中执行字符串sql
有时,我们需要在存储过程或函数中根据条件拼凑一些sql字符串语句,然后再执行拼凑后的sql字符串,如何做到呢? 参考以下代码: FUNCTION CALCULATE_TARGET_SCORE (CUR ...
- java调用Oracle分页存储过程
Java程序 package com.test; import java.sql.CallableStatement; import java.sql.Connection; import java. ...
- java 调用oracle 分页存储过程 返回游标数据集
1.分页类 package org.zh.basic; /** * 页面类 * * @author keven * */ public class PageInfo { // 定义 private S ...
- Oracle分页存储过程
1.在oracle的sqlplus或其他工具中运行一下pl/sql块建立存储过程 --创建包create or replace package testpackage astype test_curs ...
- oracle 在存储过程或函数中得到异常sql
BEGIN SQLSTR := 'UPDATE TBL ...'; EXECUTE IMMEDIATE SQLSTR; EXCEPTION WHEN OTHERS INSERT INTO LOG_TA ...
- Oracle 分页方法研究
1.Oracle 中的三大分页方法 1.1.通过分析函数分页 1.2.通过 ROWNUM 分页 1.3.通过 ROWID 分页 2.Oracle 分页解决方案浅析 2.1.纯后端代码完成分页 2.2. ...
- 懵懂oracle之存储过程3--JOB详解
在前面学习了存储过程的开发.调试之后,我们现在就需要来使用存储过程了.简单的使用,像上篇<懵懂oracle之存储过程2>中提到的存储过程调用,我们可以将写好的存储过程在另一个PL/SQL块 ...
- SQL Server的通用分页存储过程 未使用游标,速度更快!
经过一个下午的时间,和我一个同事(绝对是高手)的共同努力下,摸索出了以下的思路: 1.确定存储的输入参数: 1)SQL脚本,该参数接收完整的.正确的SQL检索文本,可将原应用中写好的SQL脚本直接传入 ...
- Oracle存储过程中异步调用的实际操作步骤
本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用 .而有些相关的业务逻辑 ...
随机推荐
- django之模板显示静态文件
由于django的模板渲染机制,图片不能直接引用,否则不会显示. <img src="/static/img/logo.jpg"> 可以看出图片的大小轮廓,但并不显示内 ...
- Hibernate给表和字段设置前后缀及分隔符
在<一口一口吃掉Hibernate(一)--使用SchemaExport生成数据表>中介绍了如何生成数据表.但是这只是最基本的.hibernate在生成或者操作数据库时,会受一些限制.比如 ...
- tree的遍历--广度优先遍历
一.二叉树demo var tree = { value: '一', left: { value: '二', left: { value: '四', right: { value: '六' } } } ...
- Java阻塞队列的实现
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞.试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列 ...
- 常用java开发文档链接
使用java开源工具httpClient及jsoup抓取解析网页数据 : https://blog.csdn.net/lovoo/article/details/52674712 jsoup Cook ...
- C# ref与out
ref参数是引用,out参数为输出参数.我写一个控制台的程序来说明一下两者的特点和区别: class Program { 3 public static void RefMethod( ref int ...
- 原生Js写轮播图代码
html css js 在知道jQuery如何实现轮播效果的基础上,用js写代码 如图:标记这里的地方 理解一下 用到的知识: 1.HTML DOM 的appendChild() 和 removeCh ...
- 蚂蚁代理免费代理ip爬取(端口图片显示+token检查)
分析 蚂蚁代理的列表页大致是这样的: 端口字段使用了图片显示,并且在图片上还有各种干扰线,保存一个图片到本地用画图打开观察一下: 仔细观察蓝色的线其实是在黑色的数字下面的,其它的干扰线也是,所以这幅图 ...
- Redis之(三)管理命令
4.1键管理 通过学习五种数据类型的操作命令,可以发现,Redis对每种数据的处理之前,都要先指定该数据的key,然后再指定对该数据进行何种操作. Redis中的key有点类似于Java中的变量名,起 ...
- 用户创建,删除and并发注册and系统登陆的API研究(学习汇总网上资料)
一.系统登陆链接实现 比如有一个外围支持系统,用户需要在外围系统登录之后点个link就可以登录到Oracle ERP系统中,那么我们需要先把外围系统的用户创建在Oracle ERP中,并且分配职责给他 ...