首页 > 数据库 >oracle 分页存储过程

oracle 分页存储过程

时间:2023-04-20 16:07:18浏览次数:38  
标签:pagesql 存储 分页 pagesize number pd sql oracle cst


 

查询oracle时,做存储过程实现分页

 

 

create or replace procedure query_by_page(
pagenum in number,
pagesql in varchar2,
pagesize in number,
pagecount out number,
allpagecount out number,
v_cur out querypage.type_cur
) as
v_sql varchar2(3000);
v_pb number;
v_pd number;
begin
     v_sql :='select count(*) from('||pagesql||')';
     execute immediate v_sql into allpagecount; -- 记录数
     pagecount :=ceil(allpagecount/pagesize);  -- 分页数
     v_pd := pagenum*pagesize +pagesize;
     v_pb := v_pd - pagesize + 1;
     v_sql := 'select * from ('||pagesql||') where rn between '||v_pb||' and '||v_pd;
     open v_cur for v_sql;
end;

 其中 这种写法效率不太好,因为内查询遍历了,过多无用的记录,所以后来把v_pd放到了内循环里,这样能减少数据量

 

 把我现在的过程贴出来了,感觉还是不太好,还不如直接传两句sql来的痛快

create or replace procedure query_by_page(
pagenum in number,
pagesql in varchar2,
pagesize in number,
pagecount out number,
allpagecount out number,
v_cur out querypage.type_cur
) as
v_sql varchar2(3000);
v_pb number;
v_pd number;
v_innner_sql varchar2(3000);
begin
     v_sql :='select count(*) from('||pagesql||')';
     execute immediate v_sql into allpagecount; -- 记录数
     pagecount :=ceil(allpagecount/pagesize);  -- 分页数
     v_pd := pagenum*pagesize +pagesize;
     v_pb := v_pd - pagesize + 1;
     if instr(pagesql,'group by') >= 1 then
      v_sql := 'select * from ('||pagesql||') where rn between '||v_pb||' and '||v_pd;
     else if instr(pagesql,'where') >= 1 
      then  v_innner_sql := pagesql||' and rownum <= '||v_pd; v_sql:='select * from ('||v_innner_sql||') where rn >='||v_pb;
     else
       v_innner_sql := pagesql || ' where rownum <= '|| v_pd; v_sql:='select * from ('||v_innner_sql||') where rn >='||v_pb;
     end if;
     end if;
     -- v_sql := 'select * from ('||pagesql||') where rn between '||v_pb||' and '||v_pd; --效率太慢
     open v_cur for v_sql;
end;

 

 顺便把java的部分代码贴出来

 

 

/**
 * 分页查询
 * @param sql
 * @param pageNum
 * @param pageSize
 * @param bean
 * @param datasource
 * @throws Exception 
 */
public static PageDataBaseBean queryUsingPaging(String sql,int pageNum,int pageSize,IDataBaseBean bean,SingleDataSource datasource) throws Exception{
	PageDataBaseBean pbl = new PageDataBaseBean();
	Connection conn = null;
	CallableStatement cst = null;
	ResultSet rs = null;
	try {
		conn = datasource.getConnection();
		cst = conn.prepareCall("call query_by_page(?,?,?,?,?,?)");
		cst.setInt(1, pageNum);
		cst.setString(2, sql);
		cst.setInt(3, pageSize);
		cst.registerOutParameter(4, Types.VARCHAR);
		cst.registerOutParameter(5, Types.INTEGER);
		cst.registerOutParameter(6, OracleTypes.CURSOR);
		cst.execute();
		int pageCount = cst.getInt(4);
		int allPageCount = cst.getInt(5);
		rs = (ResultSet) cst.getObject(6);
		//赋值
		pbl.setCurrentPageNum(pageNum);
		pbl.setPageCount(pageCount);
		pbl.setPageSize(pageSize);
		pbl.setTotalSize(allPageCount);
		IDataBaseBean databaseBean =  bean.getClass().newInstance();
		while(rs.next()){
			//赋值TODO
			databaseBean = bean.getClass().newInstance();
			databaseBean.loadFromResultSet(rs);
			pbl.insertBean(databaseBean);
		}
	} catch (Exception e) {
		e.printStackTrace();
	}finally{
		
		if(conn!=null)
			conn.close();
		if(cst!=null)
			cst.close();
		if(rs!=null)
			rs.close();
	}
	return pbl;
}

 

PageDataBaseBean是包含分页信息和实体集合的类

    IDataBaseBean是实体bean的接口

 

 

 

标签:pagesql,存储,分页,pagesize,number,pd,sql,oracle,cst
From: https://blog.51cto.com/u_2465818/6209752

相关文章

  • oracle 获取表,列注释
    前段时间,自己用的表好长,列好多(这是谁设计滴)所以给自己写了几个方法,贴出来晒晒,供以后使用: 获取列的注释createorreplacefunctionget_column_comment(tablenameinvarchar2,columnnameinvarchar2)returnvarchar2asv_commentuser_col_comments.comments%type;begin......
  • oracle 分区
    创建分区--先声明一下:列表分区不支持多列,但是范围分区和哈希分区支持多列。createtablegraderecord--范围分区根据列的值的范围(snovarchar2(10),snamevarchar2(20),dormitoryvarchar2(3),gradeint)partitionbyrange(grade)(partitionfailvalues......
  • oracle 语法备忘录
     --游标cursorobject_cursorisXXX;openobject_cursor;closeobject_cursor;   --引用游标typetype_my_ref_cursorisrefcursor;//refcursormy_ref_cursortype_my_ref_cursor;openmy_ref_cursorforXXXclosemy_ref_cursor;   --触发器createorrepl......
  • Kubuesphere部署Ruoyi(三):持久化存储配置
    按照如下教程配置NFS先服务器:https://kubesphere.io/zh/docs/v3.3/reference/storage-system-installation/nfs-server/后客户端:https://kubesphere.io/zh/docs/v3.3/installing-on-linux/persistent-storage-configurations/install-nfs-client/按照链接操作以后,在客户端上......
  • Spark+HBase数据处理与存储实验部分内容
    0.Scala+Spark+HBase的IDEA环境配置需要下载的内容:Scala、Java,注意两者之间版本是否匹配。环境:Win10,Scala2.10.6,JDK1.7,IDEA2022.3.1创建maven工程。下载Scala插件。右键项目,添加Scala框架支持。项目结果如图所示:scala添加为源目录,下存scala代码添加依赖包。将property的......
  • Oracle CASE WHEN 用法介绍
    1.CASEWHEN表达式有两种形式 --简单Case函数CASEsexWHEN'1'THEN'男'WHEN'2'THEN'女'ELSE'其他'END--Case搜索函数CASEWHENsex='1'THEN'男'WHENsex='2'THEN'女&......
  • Oracle MySQL Server 拒绝服务漏洞(CVE-2023-21912) 修复
    CVE编号公告标题和摘要最高严重等级受影响的软件CVE-2023-21912OracleMySQLServer拒绝服务漏洞未经身份验证的远程攻击者可通过MySQL协议网络访问MySQLServer,成功利用此漏洞可导致目标MySQLServer挂起或频繁重复崩溃,造成拒绝服务攻击重要MySQLServer<=5.7.41......
  • How to Configure SSL/TLS on ORACLE RAC
    GoalThisdocumentwilldemonstratethestepsrequiredtoconfigureSSL/TLSonRACorSIHA.Instructionisbyexampleandalsoshowsvariousmethodstocheckthestateoftheconfiguration. "SSL"inthisdocumentreferstoeitherSSLorTLSpr......
  • BOM-本地存储和会话存储
    1、介绍本地存储和会话存储,分别指window.localStorage和window.sessionStorage。两者具有基本相同的语法,都可以存储数据到浏览器中,区别在于localStorage是永久存储,而sessionStorage是会话存储。2、语法storage表示window.localStorage和window.sessionStorage。(1)写入或保存/......
  • 图的存储
    所谓图(graph),是图论中基本的数学对象,包括一些顶点,和连接顶点的边。图可以分为有向图和无向图,有向图中的边是有方向的,而无向图的边是双向连通的。邻接矩阵(适用于稠密图)用一个二维数组来记录各个点之间的关系,若u到v之间有一条边则可用map[u][v]=1来表示,具体如下对应的无......