PostgGresql如何简单实现sqlserver中的分页存储过程

时间:2021-07-27 14:04:18

 

 

 

相信一直在搞sqlserver的人突然要将数据库从sqlserver迁移到postgresql来,一定会很关注诸如sqlserver和postgresql数据类型的差异、存储过程、作业、视图、触发器如何转换的问题,很幸运的最近遇到了一个做完的项目要从sqlserver2008转换到postgresql, 由于项目的规模不大,因此数据库中只涉及到几十张基本表,加上一个分页的存储过程和一个作业,但是数据量确实异常的大,考虑到以后的分布式存储也是要换数 据库的一个原因(当然作为一个刚入行一年的小菜我来说,不会说出这样的话,嘿嘿是一个预言组的同事的构想,可惜苦逼的做事的是我呵呵);今天经过对postgresql文档的简短的查看,大概了解一二,我就看是动手做了,建表的过程不用说了,就是注意下类型,控制好别弄错了为以后带来麻烦。

废话不多说,直接说PostgGresql如何实现分页

下面的是sqlserver中的分页存储过程:

CREATE PROCEDURE [dbo].[PAGESELECT]

@SQLPARAMS nvarchar(2000)='', --查询条件

@PAGESIZE int=20,--每页的记录数

@PAGEINDEX int=0, --第几页,默认第一页

@SQLTABLE varchar(5000),--要查询的表或视图,也可以一句sql语句

@SQLCOLUMNS varchar(4000),--查询的字段

@SQLPK varchar(50),--主键 

@SQLORDER varchar(200),--排序

@Count int=-1 output

AS

BEGIN

SET NOCOUNT ON;

DECLARE @PAGELOWERBOUND INT 

DECLARE @PAGEUPPERBOUND INT

DECLARE @SQLSTR nvarchar(4000)

--获取记录数

IF @PAGEINDEX=0  --可根据实际要求修改条件,如果是总是获取记录数

BEGIN

set @SQLSTR=N'select @sCount=count(1) FROM '+@SQLTABLE+' WHERE 1=1'+@SQLPARAMS

Exec sp_executesql @sqlstr,N'@sCount int outPut',@Count output

END

ELSE

BEGIN

SET @COUNT =-1 

END

 

SET @PAGELOWERBOUND= @PAGEINDEX *@PAGESIZE+1

SET @PAGEUPPERBOUND = @PAGELOWERBOUND +@PAGESIZE-1

IF @SQLORDER=''

BEGIN

SET @SQLORDER='ORDER BY '+@SQLPK

END

 

 

SET @SQLSTR=N'SELECT * FROM (select '+@SQLCOLUMNS+',ROW_NUMBER() Over('+@SQLORDER+') as PAGESELECT_rowNum FROM '+@SQLTABLE+' WHERE 1=1'+@SQLPARAMS+ ') as PAGESELECT_TABLE

where PAGESELECT_rowNum between '+STR(@PAGELOWERBOUND)+' and '+STR(@PAGEUPPERBOUND)+' '

print @SQLSTR

Exec sp_executesql @SQLSTR

 

SELECT @COUNT

 

END

 

 

  咋一想,sqlServer上的思路照着弄到postgresql中就ok了(存储过程在postgresql中叫函数),后来也确实根据sql改了一个存储过程,写了一大串,其实在postgresql中远远不用这么麻烦的,postgresql根据情况写一个sql就可以了,其实存储过程中也是这么实现的

 

Select  @columns from  @table where 1=1 and  @params  order by  @order   limit @pagesize offset @pagelowbound

然后在项目中动态的写入参数就ok了,都说分页支持多少万多少万的数据,但是我有点迷糊如何才是负载呢

 

项目现在还差作业没弄到postgresql,下一步就要弄这个....希望明天能搞定。

我是一只小菜,那里写错了或是言语上说错了请不吝指教,我需要大家的帮助,好多不懂好多劈头盖面的迷茫!!!!