分页存储过程
- 格式:doc
- 大小:137.00 KB
- 文档页数:5
jeecg 存储过程结果集分页一、背景介绍在实际的软件开发过程中,我们通常会遇到需要对数据库中的数据进行分页查询的需求。
而在使用 jeecg 框架进行开发时,我们可以通过调用存储过程来从数据库中获取分页数据,以提高查询效率和减少网络传输的数据量。
二、存储过程概述1. 存储过程是一组经编译并存储在数据库中的SQL语句。
2. 存储过程可以包括查询、更新、删除等操作,可以接收参数,并返回结果集。
3. 存储过程可以通过调用来简化复杂的业务逻辑,提高数据库的执行效率。
三、jeecg 中存储过程调用在 jeecg 框架中,可以通过使用 MyBatis 或者 Hibernate 等持久层框架来调用存储过程。
下面我们以 MyBatis 为例来介绍如何在 jeecg 中调用存储过程来实现结果集的分页查询。
四、使用 MyBatis 调用存储过程1. 创建存储过程我们需要在数据库中创建一个存储过程,用于实现分页查询。
以下是一个简单的存储过程示例:```sqlCREATE PROCEDURE `getPaginatedData` (IN pageNum INT, IN pageSize INT)BEGINDECLARE offsetNum INT;SET offsetNum = (pageNum - 1) * pageSize;PREPARE stmt FROM 'SELECT * FROM your_table LIMIT ?, ?';SET pageNum = offsetNum;SET pageSize = pageSize;EXECUTE stmt USING pageNum, pageSize;DEALLOCATE PREPARE stmt;END```在这个示例中,我们创建了一个名为`getPaginatedData`的存储过程,接受两个参数 pageNum 和 pageSize,用于指示需要查询的页数和每页的数据条数。
分页、分段与段页式存储⼀. 分页存储管理1.基本思想⽤户程序的地址空间被划分成若⼲固定⼤⼩的区域,称为“页”,相应地,内存空间分成若⼲个物理块,页和块的⼤⼩相等。
可将⽤户程序的任⼀页放在内存的任⼀块中,实现了离散分配。
1) 等分内存页式存储管理将内存空间划分成等长的若⼲物理块,成为物理页⾯也成为物理块,每个物理块的⼤⼩⼀般取2的整数幂。
内存的所有物理块从0开始编号,称作物理页号。
2) 逻辑地址系统将程序的逻辑空间按照同样⼤⼩也划分成若⼲页⾯,称为逻辑页⾯也称为页。
程序的各个逻辑页⾯从0开始依次编号,称作逻辑页号或相对页号。
每个页⾯内从0开始编址,称为页内地址。
程序中的逻辑地址由两部分组成:页号P和页内位移量W。
在执⾏⼀个程序之前,内存管理器需要的准备⼯作:1) 确定程序的页数2) 在主存中留出⾜够的空闲页⾯3) 将程序的所有页⾯载⼊主存⾥。
(静态的分页,页⾯⽆需连续)2. 分页存储管理的地址机构页号x位,每个作业最多2的x次⽅页,页内位移量的位数表⽰页的⼤⼩,若页内位移量y位,则2的y次⽅,即页的⼤⼩,页内地址从000000000000开始到2的y次⽅若给定⼀个逻辑地址为A,页⾯⼤⼩为L,则页号P=INT[A/L],页内地址W=A MOD L3.内存分配相邻的页⾯在内存中不⼀定相邻,即分配给程序的内存块之间不⼀定连续。
对程序地址空间的分页是系统⾃动进⾏的,即对⽤户是透明的。
由于页⾯尺⼨为2的整数次幂,故相对地址中的⾼位部分即为页号,低位部分为页内地址。
4. 页表分页系统中,允许将进程的每⼀页离散地存储在内存的任⼀物理块中,为了能在内存中找到每个页⾯对应的物理块,系统为每个进程建⽴⼀张页表,⽤于记录进程逻辑页⾯与内存物理页⾯之间的对应关系。
页表的作⽤是实现从页号到物理块号的地址映射,地址空间有多少页,该页表⾥就登记多少⾏,且按逻辑页的顺序排列,形如:5. 地址变换页式虚拟存储系统的逻辑地址是由页号和页内地址两部分组成,地址变换过程如图7-3所⽰。
Sql中Output参数⽤法和分页存储过程USE [CapitalFortune]GO/****** Object: StoredProcedure [dbo].[SetMultiPages] Script Date: 05/30/2012 10:17:02 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO-- =============================================-- Author: hugejile-- alter date: 2070-9-29-- Description: 分页,请勿随意改动-- =============================================ALTER PROCEDURE [dbo].[SetMultiPages]-- Add the parameters for the stored procedure here@TableName NVARCHAR(2000),@ColumnNames NVARCHAR(2000),@Conditions NVARCHAR(2000),@OrderbyString NVARCHAR(2000),@PageSize INT=1000,@CurrentPage INT=1,@RecordCount INT=0 OUTPUT,@PageCount INT=1 OUTPUTASBEGIN-- SET NOCOUNT ON added to prevent extra result sets FROM-- interfering with SELECT statements.SET NOCOUNT ON;DECLARE @Sql NVARCHAR(4000),@RowCount INTSET @RowCount=0IF @ColumnNames is null or LEN(@ColumnNames)=0BEGINSET @ColumnNames='*'ENDIF @CurrentPage is nullBEGINSET @CurrentPage=1ENDIF @PageSize is nullBEGINSET @PageSize=10ENDIF @Conditions is nullBEGINSET @Conditions=''ENDELSEBEGINIF LEN(@Conditions)<>0BEGINSET @Conditions=' WHERE ' + @ConditionsENDEND-- INSERT statements for procedure hereIF @CurrentPage>0BEGINSET @Sql= N'SELECT * FROM (SELECT , (ROW_NUMBER() over (ORDER BY )) AS RowNum FROM )T WHERE T.RowNum Between '+Cast((@CurrentPage-1)*@PageSize+1 AS NVARCHAR(10)) + ' and ' + Cast(@CurrentPage*@PageSize AS NVARCHAR(10)) + ';SET @RowCount =ROWCOUNT_BIG()'PRINT 'SELECT CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RowCount INT OUTPUT',@RowCount OUTPUTSET @Sql = 'SELECT @RecordCount = COUNT(*) FROMPRINT 'Count CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RecordCount INT OUTPUT',@RecordCount OUTPUTSET @PageCount=ceiling(1.0 * @RecordCount / @PageSize)PRINT @RecordCount--RETURN @RecordCountENDELSE IF @PageSize>0BEGINSET @Sql= N'SELECT TOP ' + Cast(@PageSize as nvarchar(10)) + ' ' + @ColumnNames + ', (ROW_NUMBER() over (ORDER BY )) AS RowNum FROM ORDER BY ' + @OrderbyStringPRINT 'SELECT CommandText: ' + @SqlEXEC (@Sql)SET @Sql = 'SELECT @RecordCount = COUNT(*) FROMPRINT 'Count CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RecordCount INT OUTPUT',@RecordCount OUTPUTSET @PageCount = CEILING(CAST(@RecordCount AS FLOAT)/CAST(@PageSize AS FLOAT))--print cast(@RecordCount as nvarchar(10)) + ' pagesize ' + Cast(@PageSize as nvarchar(10))--print @PageCount--RETURN @RowCountENDELSEBEGINSET @Sql= N'SELECT ' + @ColumnNames + ', (ROW_NUMBER() over (ORDER BY )) AS RowNum FROM ORDER BY ' +@OrderbyString +'; SET @RecordCount = ROWCOUNT_BIG()'PRINT 'SELECT CommandText: ' + @Sql--EXEC (@Sql)--SET @Sql = ''--PRINT 'Count CommandText: ' + @SqlEXECUTE sp_executesql @Sql,N'@RecordCount INT OUTPUT',@RecordCount OUTPUTSET @PageCount = -1ENDRETURN 1END这个是分页存储过程,百万级数据应该没有问题调⽤⽅法DECLARE @return_value INT,@RecordCount INT ,@PageCount INT ,@PageSize INTEXEC @return_value = [dbo].[SetMultiPages]@TableName = 'USERS',@ColumnNames = '*',@Conditions = '',@OrderbyString = 'UserId',@PageSize = 10,@CurrentPage = 0,@RecordCount = @RecordCount output,@PageCount = @PageCount outputSELECT @RecordCount AS N'RecordCount',@PageCount AS N'PageCount',@PageSize AS N'PageSize'@RecordCount = @RecordCount output,@PageCount = @PageCount output这两个参数是输出参数,⽤来接受存储过程中的输出参数的值,计算总数据和总页数。
简述分页存储管理基本方法分页存储管理是计算机系统中一种用于管理内存空间的技术。
它将内存空间划分成若干个大小相等的块,称为页,然后通过管理这些页来实现内存空间的有效利用。
分页存储管理的基本方法包括:
1.页表法:将所有的页映射到一张表中,表中的每一项
记录了该页所在的位置。
在访问内存时,先根据地址
查找页表,然后获取该页所在的位置,最后再访问该
位置的内存。
2.页式存储法:将内存空间划分为若干个区域,每个区
域包含若干个页。
在访问内存时,先根据地址确定所
在的区域,然后再访问该区域的内存。
3.段页式存储法:将内存空间划分为若干个段,每个段
再划分为若干个页。
在访问内存时,先根据地址确定
所在的段,然后再根据地址确定所在的页,最后访问
内存。
分页存储管理能够有效提高内存的利用率,减少内存碎片的问题,但同时也会增加访问内存的时间开销。
第十六讲存储器管理之请求分页存储管理方式1 基本概述请求分页管理是建立在基本分页基础上的,为了能支持虚拟存储器而增加了请求调页功能和页面置换功能。
基本原理:地址空间的划分同页式;装入页时,可装入作业的一部分(运行所需)页即可运行。
2 请求分页的硬件支持为实现请求分页,需要一定的硬件支持,包括:页表机制、缺页中断机构、地址变换机构。
2.1 页表机制作用:将用户地址空间的逻辑地址转换为内存空间的物理地址。
因为请求分页的特殊性,即程序的一部分调入内存,一部分仍在外存,因此页表结构有所不同。
如图:说明:(1)状态位P:指示该页是否已调入内存。
(2)访问字段A:记录本页在一段时间内被访问的次数或最近未被访问的时间。
(3)修改位M:表示该页在调入内存后是否被修改过。
若修改过,则换出时需重写至外存。
(4)外存地址:指出该页在外存上的地址。
2.2 缺页中断机构在请求分页系统中,每当所要访问的页面不在内存时,便产生缺页中断,请求OS将所缺的页调入内存。
缺页中断与一般中断的区别:(1)在指令执行期间产生和处理中断信号(2)一条指令在执行期间,可能产生多次缺页中断2.3 地址变换机构请求分页系统的地址变换机构。
是在分页系统地址变换机构的基础上,又增加了一些功能。
例:某虚拟存储器的用户空间共有32个页面,每页1KB,主存16KB。
假定某时刻系统为用户的第0、1、2、3页分别分配的物理块号为5、10、4、7,试将虚拟地址0A5C和093C 变换为物理地址。
解:虚拟地址为:页号(2^5=32)5位页内位移(1K =2^10=1024)10位物理地址为物理块号(2^4=16)4位因为页内是10 位,块内位移(1K =2^10=1024)10位虚拟地址OA5C对应的二进制为:00010 1001011100即虚拟地址OA5C的页号为2,页内位移为1001011100,由题意知对应的物理地址为:0100 1001011100即125C同理求093C。
积木报表存储过程分页
现在,在各种软件系统中,报表输出已经成为一项非常重要的工作。
而在报表制作过程中,通常需要用到分页功能,以便更好地呈现数据。
在数据库中,我们可以通过存储过程来实现报表的分页。
具体来说,可以通过以下步骤来实现:
1.定义需要输出的字段和排序方式。
2.根据需要的条件筛选数据,并按照排序方式进行排序。
3.根据每页需要显示的数据条数,计算出需要分成多少页。
4.通过参数传递当前页码,计算出需要输出的数据范围。
5.输出当前页的数据。
6.根据需要输出的总页数,生成页码导航栏。
通过以上步骤,我们就可以实现基本的分页功能。
当然,为了使报表更加美观,我们还可以在输出页面中添加一些样式和图表等元素。
总的来说,无论是在企业管理系统还是其他行业的软件系统中,报表分页都是一个必不可少的功能,也是一个需要程序员不断优化和改进的领域。
- 1 -。
通用分页存储过程1通用分页存储过程说明1.1存储过程名称:Common_Sp_Pagination1.2存储过程代码:ALTER PROC [dbo].[Common_Sp_Pagination]@StrSql VARCHAR(MAX),@PageIndex INT,--当前页码@PageCount INT,--每页条数@SortClause VARCHAR(100),--排序字段,不加“Order by”@Filter VARCHAR(200),--条件,可以为空,不加where@TotalNum INT OUTPUT--总记录条数ASDECLARE @ExeSql VARCHAR(MAX)DECLARE @OrderByStr VARCHAR(100)DECLARE @StartRowIndex INTDECLARE @EndRowIndex INTSET @StartRowIndex =( @PageIndex - 1 )* @PageCount + 1SET @EndRowIndex = @PageIndex * @PageCount/*--条件筛选--*/IF @Filter IS NOT NULLAND @Filter <>''BEGINSET @StrSql = @StrSql +' WHERE '+ @FilterEND/*--排序--*/IF @SortClause IS NOT NULLAND @SortClause <>''BEGINSET @OrderByStr =' order by '+ @SortClauseSET @ExeSql =' SELECT * FROM ('+ @StrSql+') AS A where rowIndex between '+CAST(@StartRowIndex AS VARCHAR) +' And '+CAST(@EndRowIndex AS VARCHAR)+' '+ @OrderByStrENDELSEBEGINSET @ExeSql =' SELECT * FROM ('+ @StrSql+') AS A where rowIndex between '+CAST(@StartRowIndex AS VARCHAR) +' And '+CAST(@EndRowIndex AS VARCHAR)+' 'ENDPRINT @StrSqlPRINT @ExeSql/*---查询总数-*/CREATE TABLE #temp ( TotalNum INT)DECLARE @InsertTemp VARCHAR(max)SET@InsertTemp ='insert into #temp select count(*) from ('+@StrSql +') as A'--PRINT @InsertTempEXEC(@InsertTemp)SELECT @TotalNum = TotalNumFROM #tempDROP TABLE #temp/*--查询分页信息--*/EXEC(@ExeSql)2举例说明:2.1该例子是在CMS_INFO_SelectCmsInfoByInfoClassIdForPage存储过程中调用通用的分页存错过程Common_Sp_Pagination,实现根据栏目编号分页获取栏目信息2.2主调用存储过程代码CREATE PROC [dbo].[CMS_INFO_SelectCmsInfoByInfoClassIdForPage]@InfoClassId VARCHAR(50),--所属栏目编号@CurrentPage INT,--当前页码@PageSize INT,--每页记录数量@SortClause VARCHAR(2000),--不加'ORDER BY' 的排序语句@TotalNum INT OUTPUT-- 总记录数量ASIF @SortClause IS NULLOR @SortClause =''BEGINSET @SortClause ='CreateDateTime desc'ENDDECLARE @StrSql VARCHAR(2000)SET @StrSql ='SELECTInfoId ,InfoDelegate ,InfoMainTitle ,CreatePerson ,CreateDateTime ,STATUS,ROW_NUMBER() OVER ( ORDER BY '+ @SortClause+' ) AS rowIndexFROM ( SELECT InfoId ,InfoDelegate ,InfoMainTitle ,erName AS CreatePerson ,CONVERT(VARCHAR(10), A.CreateDateTime, 120) AS CreateDateTime ,CASE ( Status )WHEN ''0'' THEN ''草稿''WHEN ''1'' THEN ''有效''ELSE ''不知名状态''END AS StatusFROM dbo.CMS_INFO AS A WITH ( NOLOCK )LEFT JOIN dbo.ADMIN_USER AS B WITH ( NOLOCK ) ONa.CreatePerson =erPKIdWHERE InfoClassId = '''+ @InfoClassId +'''AND Status <> ''*'') AS A'EXEC mon_Sp_Pagination @StrSql, @CurrentPage, @PageSize, @SortClause,NULL, @TotalNum OUTPUT3注意事项3.1主调用存储过程的@StrSql中必须包含以下的语句,用户生成行号 ROW_NUMBER()OVER ( ORDER BY xxxx) AS rowIndex,其中’xxxx’为排序字段,该列可以放在查询字段的任意位置,为了配合华磊开发的新的dategrid,最好放在最后一列3.2如果在@StrSql中涉及到多表查询,并以“表名.字段名”来查询字段的,最好为该字段加上别名,同时在@SortClause中使用别名替代3.3在@SortClause中出现的字段必须在查询字段中存在。
分页存储过程使用最简单方便的分页存储过程。
调用只需要运行:NewPageView exec 查询字符串,当前页,显示条数即可,查询字符串可使用任意没有语法错误的SQL语句,包括 order by 主意需要将SQL语句中的单引号用俩个单引号或^(shift+6)代替例如exec NewPageView'select b,c,d,e,f from temp where b=^测试^',10000,20 exec NewPageView'select b,c,d,e,f from temp where b=’’测试’’',10000,20 查询结果为俩个表,表1为当前页内容,表2为记录数据,总计页数等信息该存储过程应该是目前网上使用最方便的存储过程了吧,其它分页存储过程必须提供order by 列,这样会大大降低查询速度,该存储过程可以随意使用SQL语句,且省去像其它存储过程的大量参数。
简单易懂。
该存储过程转至ajaxyurenzg QQ:312430633/****** Object: StoredProcedure [dbo].[NewPageView] Script Date: 12/27/2012 12:24:12 ******//*创建日期:2007年,更新日期2012.12.27,创建人QQ:312430633*/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOALTER PROCEDURE[dbo].[NewPageView]@tsql varchar(4000),----*****SQL语句@pageindex int,----*****页码@PageSize int----*****每页显示条数asDeclare@SqlSelect varchar(4000)Declare@UnSqlSelect varchar(4000)Declare@orderby varchar(4000)Declare@AllowPagingSql varchar(4000)---判断是否排序if CHARINDEX('order by',@tsql)<> 0beginset@SqlSelect=replace(substring(@tsql,1,CHARINDEX('orderby',@tsql)-1),'$','''')set@UnSqlSelect=replace(@SqlSelect,'Select','')set@orderby=replace(substring(@tsql,CHARINDEX('orderby',@tsql),len(@tsql)),'$','''')set@AllowPagingSql='select * from (SELECT ROW_NUMBER() OVER('+@orderby+') AS AllowPagingId,* FROM ( select top '+convert(varchar(10),@pageindex*@PageSize)+' '+@UnSqlSelect+' ) as tbs1 ) as table2 where AllowPagingId between '+convert(varchar(10),((@pageindex-1)*@PageSize+1))+' and '+convert(varchar(10),@pageindex*@PageSize)exec (@AllowPagingSql)endelsebeginset@SqlSelect=replace(@tsql,'$','''')set@orderby=''set@AllowPagingSql='select * from (SELECT ROW_NUMBER() OVER(ORDER BY orderbyID DESC) AS AllowPagingId ,* FROM ( select *, 1 as orderbyID from ( select top '+convert(varchar(10), @pageindex*@PageSize)+' '+@UnSqlSelect+' ) as tbs1 ) as Tabl1 ) as table2 where AllowPagingId between '+convert(varchar(10),((@pageindex-1)*@PageSize+1))+' and '+convert(varchar(10),@pageindex*@PageSize)exec (@AllowPagingSql)endset@AllowPagingSql='selectcasewhen count(*)%'+convert(varchar(10),@PageSize)+'=0 thencount(*)/'+convert(varchar(10),@PageSize)+'when count(*)%'+convert(varchar(10),@PageSize)+'<>0 thencount(*)/'+convert(varchar(10),@PageSize)+'+1end as pageCount,count(*) as RowsCount from ('+@SqlSelect+') as tab1'exec (@AllowPagingSql)使用示例:1、exec NewPageView'select b,c,d,e,f from temp',10000,202、exec NewPageView'select b,c,d,e,f from temp where b=^测试^',10000,20exec NewPageView'select b,c,d,e,f from temp where b=’’测试’’',10000,20提示:(示例2中的^替换查询语句中的单引号’,也可以使用’’俩个单引号替换单引号。
)因为SQL语句会在存储过程中当作字符串进行处理)3、exec NewPageView'select b,c,d,e,f from temp order by b',10000,20200万条带Order BY用时400万条带Order BY用时在这里在为大家增上一段C#的分页数据生成类///<summary>///数ºy据Y分¤?页°3///</summary>///<param name="Sql">查¨¦询¡¥语®?句?</param>///<param name="PageIndex">页°3码?</param>///<param name="PageSize">每?页°3显?示º?条¬?数ºy</param>///<returns></returns>public static string PagingAll(string Sql, int PageIndex, int PageSize){string selectStr = "", orderStr = "";int rows = PageIndex * PageSize;string val = "";selectStr = Sql.ToUpper();if (selectStr.IndexOf("TOP") == -1){selectStr = "SELECT TOP "+ rows.ToString()+" " + selectStr.Substring(selectStr.IndexOf("SELECT"), selectStr.Length - selectStr.IndexOf("SELECT"));}if (selectStr.IndexOf("ORDER BY") != -1){orderStr = selectStr.Substring(selectStr.IndexOf("ORDER BY"), selectStr.Length - selectStr.IndexOf("ORDER BY"));selectStr = selectStr.Substring(0, selectStr.IndexOf("ORDER BY"));}if (selectStr.IndexOf("ORDER BY") == -1){val = @"select * from (SELECT ROW_NUMBER() OVER(ORDER BY orderbyID DESC) AS AllowPagingId,* FROM ( select *, 1 as orderbyID from ( " + selectStr + @" ) as tbs1 )as Tabl1 ) as table2 whereAllowPagingId between " + ((PageIndex - 1) * PageSize).ToString() + " and " + rows.ToString();}else{val = @"select * from (SELECT ROW_NUMBER() OVER(" + orderStr + @") AS AllowPagingId ,* FROM ( select * from ( " + selectStr + @" ) as tbs1 )as Tabl1 ) as table2 whereAllowPagingId between " + ((PageIndex - 1) * PageSize).ToString() + " and " + rows.ToString();}return val;}使用示例可以查看生成的SQL语句,在SQL在SQL中可测试结果TextBox1.Text = SqlClass.PagingAll("select * from temp", 5, 10);。