相信一直在搞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,下一步就要弄这个....希望明天能搞定。
我是一只小菜,那里写错了或是言语上说错了请不吝指教,我需要大家的帮助,好多不懂好多劈头盖面的迷茫!!!!