欢迎来到千学网!
您现在的位置:首页 > 实用文 > 其他范文

关于存储过程分页,我的测试情况

时间:2022-05-24 02:24:53 其他范文 收藏本文 下载本文

【导语】以下是小编为大家收集的关于存储过程分页,我的测试情况(共10篇),欢迎参阅,希望可以帮助到有需要的朋友。

关于存储过程分页,我的测试情况

篇1:关于存储过程分页,我的测试情况

在精华区中关于存储过程分页大概有三种思路

分别是:

临时表,参见658037 在下提供一个存储过程分页的方法

游标,参见658066 一种理论上最快的Web数据库分页方法!

set rowcount 方法,参见

658606 关于存储过程分页

我做了一个10万条记录的表来进行测试

结果临时表光建立数据就用了四十秒

游标有大小限制,我的机子上最大只能到1万条,更多的就无法用了,

关于存储过程分页,我的测试情况

set rowcount 方法不错,5000多页,只用不到1秒。

呵呵

篇2:存储过程实现分页

USE [HDIS]

GO

/****** Object: StoredProcedure [dbo].[AspNetPager] Script. Date: 12/30/ 09:00:35 ******/

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

Create procedure [dbo].[AspNetPager]

(@tablename nvarchar (1000), --表名

@filedname nvarchar (4000), --查询的字段

@startIndex int, --起始记录数

@endIndex int, --结束记录数

@where nvarchar (4000), --条件 (不包含where)

@orderfiled nvarchar (100), --排序字段 (CreateDate desc)

@PageSize int,

@prmkeyName nvarchar (100),

@pageIndex int,

@docount bit)

as

begin

declare @date varchar(50),@sql nvarchar (4000) ,@i int

select @date =CONVERT(nvarchar(50), serverproperty(‘productversion‘))

--if(CONVERT(int, SUBSTRING(@date,0,3))>8) ------sql以上

-- begin

-- if(@docount=1)

-- set @sql = ‘select count(*) from ‘ + @tablename +‘ where ‘ + @where

-- else

-- begin

-- set @sql =‘

-- with temptbl as (

-- SELECT ROW_NUMBER OVER (ORDER BY ‘+ @orderfiled +‘ )AS Row, * from ‘+ @tablename +‘ where ‘+ @where +‘)

-- SELECT ‘+ @filedname +‘ FROM temptbl where Row between ‘+CONVERT(nvarchar(100),@startIndex) +‘ and ‘+CONVERT(nvarchar(100),@endIndex )

-- END

-- exec (@sql)

-- end

--else

begin -------sql2000

if(@docount=1)

set @sql = ‘select count(*) from ‘ + @tablename +‘ where ‘ + @where

else

begin

set @i= CONVERT(nvarchar(100),@PageSize)*(CONVERT(nvarchar(100),@pageIndex)-1)

set @sql = ‘SELECT TOP ‘+ CONVERT(nvarchar(100),@PageSize) +‘ *

FROM ‘ + @tablename +‘ WHERE (‘+@where +‘ and‘+@prmkeyName+‘ NOT IN

(SELECT TOP ‘+CONVERT(nvarchar(100),@i)+‘ ‘ +@prmkeyName +‘

FROM ‘ + @tablename +‘ WHERE ‘ + @where+‘ ORDER BY ‘+ @orderfiled +‘)) ORDER BY ‘+ @orderfiled

end

--print(@sql)

exec (@sql)

end

end

篇3:分页存储过程代码

-10-10sql with as用法详解

2013-01-01sqlserver中关于WINDOWS性能计数器的介绍

2013-06-06解析sql中得到刚刚插入的数据的id

2014-06-06SQL Server出现System.OutOfMemoryException异常的解决方法

-03-03将Session值储存于SQL Server中

2013-10-10利用SQL语句给字段加注释的方法

2013-02-02SQL Server利用bcp命令把SQL语句结果生成文本文件

2014-03-03sql时间格式化输出、Convert函数应用示例

-06-06三步堵死 SQL Server注入漏洞

2009-08-08一个简单的SQL 行列转换语句

篇4:分页存储过程代码

最近更 新

sqlserver性能调优经验总结

SqlServer 实用操作小技巧集合

sqlserver中求字符串中汉字的个数的sql语

sqlserver数据库移动数据库路径的脚本示例

mssql server 存储过程里,bulk insert t

SQL 多表连接查询实现语句

sql语句返回主键SCOPE_IDENTITY

如何在 SQL SERVER 中快速有条件删除海量

深入SQL Server中定长char(n)与变长varch

全文检索技术 sql server

热 点 排 行

SQL Server 图文安装教程

SQL Server 安装图解教程(附

sqlserver中distinct的用法(不重

SQL Server导入、导出、备份数据

SQL语句去掉重复记录,获取重复记

SQL Server数据库入门学习总结

SQL Server错误代码大全及解释(

sql convert函数使用小结

sql 时间函数 整理的比较全了

用SQL语句添加删除修改字段、一些

篇5:一个分页存储过程代码

-12-12一个常用的报表统计SQL语句

-04-04SQL Server 数据库转 SQL Server 的方法小结

-03-03搜索sql语句

2007-03-03海量数据库的查询优化及分页算法方案

-09-09一个删选数据的例子,使用GROUP、DISTINCT实例解析

2008-10-10在 SQLSERVER 中快速有条件删除海量数据

2010-08-08ADO.NET EF中的实体修改方法

2013-11-11sql server获得新记录标识列值的二种方法

2013-06-06浅析被遗忘的SQLServer比较运算符修饰词

2012-06-06ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函

篇6:一个分页存储过程代码

最近更 新

SQL 判断给定日期值(或时间段)所在星期的

Sql function 多行中的列合并为一行一列的

SQL Server中减小Log文件尺寸的方法分享

分享SQL Server删除重复行的6个方法

sql获取分组排序后数据的脚本

sqlserver数据库迁移后,孤立账号解决办法

SQLServer 数据库中如何保持数据一致性

使用xp_cmdshell注销Windows登录用户(终端

Sql Server 2000 行转列的实现(横排)

SQL里面用自定义Split完成个性化需求

热 点 排 行

SQL Server 图文安装教程

SQL Server 安装图解教程(附

sqlserver中distinct的用法(不重

SQL Server导入、导出、备份数据

SQL语句去掉重复记录,获取重复记

SQL Server数据库入门学习总结

SQL Server错误代码大全及解释(

sql convert函数使用小结

sql 时间函数 整理的比较全了

用SQL语句添加删除修改字段、一些

篇7:关于Oracle存储过程测试

常规方式保存测试信息

创建相关数据表

创建数据表TestInfoLog,和序列号SEQ_TestInfoLog

参考当前目录下的 TestInfoLog.sql ,运行这部分脚本,

创建测试信息保存包

创建一个测试信息保存的 Package

参考当前目录下的 PKG_Test_Info.pck,编译这个包。

具体例子

例子1

在一个PL/SQL块中使用测试包来保存测试信息,参考当前目录下的 example1.sql

-- 简单使用的一个例子,结果查询

select * from TESTINFOLOG

declare

i integer :=1;

begin

PKG_Test_Info.clearAllLogInfo;

PKG_Test_Info.setLogContext('匿名块测试','无',1);

PKG_Test_Info.logInfo('i=1');

PKG_Test_Info.logInfo('当前日期='||To_char(sysdate,'yyyy-mm-dd'));

end;

例子2

在一个存储过程中保存测试信息

参考当前目录下的Test_PKG_Test_Info.prc

---在存储过程中保存测试信息,结果查询 select * from TESTINFOLOG

create or replace procedure Test_PKG_Test_Info(p_Param1 int,

p_Param2 int,

p_保存日志信息 int default 1) is

begin

if(p_保存日志信息)=1 then

PKG_Test_Info.clearAllLogInfo;

PKG_Test_Info.setLogContext('存储过程测试', 'Test_PKG_Test_Info', 1);

PKG_Test_Info.logInfo('p_Param1='||to_char(p_Param1)||',p_Param2='

||to_char(p_Param2));

end if;

end ;

卸载脚本

参考 uninsall.sql ,如果需要卸载运行这个脚本

其它的方式保存测试信息

Log4plsql的介绍

Log4plsql是一个open source的工具,是一个在Oralce PL/SQL 下实现的LOG框架。

Log4plsql 是基于log4J 演化得来的。

相关站点

log4plsql.sourceforge.net/

sourceforge.net/projects/log4plsql/

Log4plsql来做测试。

1.触发器的测试信息保存

1个触发器的例子,在触发器中记录相关信息

代码位于当前文件所在目录的 LOG_DML.sql

CREATE OR REPLACE TRIGGER LOG_DML BEFORE

INSERT OR UPDATE OR DELETE

ON T_ESSAIS FOR EACH ROW

BEGIN

IF DELETING OR UPDATING THEN

PLOG.INFO('T_ESSAIS:OLD:'||USER||':'||ld.data);

END IF;

IF INSERTING OR UPDATING THEN

PLOG.INFO('T_ESSAIS:NEW:'||USER||':'||:new.data);

END IF;

end;

2.存储过程中测试信息保存

在存储过程中进行日志操作,把相关存储过城的参数信息记录到日志数据表

代码位于当前文件所在目录的 testAssert.sql

create or replace procedure testAssert(p_Param1 int,p_Param2 varchar2)

IS

pCTX PLOG.LOG_CTX;

BEGIN

--如果 p_Param1<=1,那相关信息就将写入日志

PLOG.ASSERT(pCTX, p_Param1>1, 'p_Param1>1 always false');

--如果 p_Param2'man',那相关信息就将写入日志

PLOG.ASSERT(p_Param2 = 'man', 'p_Param2 man ');

PLOG.ASSERT(1 is null, '1 is null always false');

PLOG.ASSERT(NOT 1>1, 'NOT 1>1 never false');

PLOG.ASSERT(1>2, '1>2 always false', -1,

pRaiseExceptionIfFALSE=>TRUE ,

pLogErrorReplaceError=>FALSE);

PLOG.ASSERT(1>3, 'Never test there is a raise in previous assert');

END;

3.实现了树型目录的日志例子

代码位于当前文件所在目录的 testAssert2.sql

/**

*

purpose:这是一个在存储过程过程通过日志方式进行记录测试信息的例子,实现了树型目录的日志记录方式

*

*

* 使用方式

*

编译该存储过程

*

* 删除TLOG表中的日志信息: delete from TLOG

*

* 测试该存储过程

* begin testassert2(10,'wdz123@hotmailcom');end;

*

* 察看结果 select from tlog

*

* @param p_Param1 是一个入口参数 ,它的值将被记录进入 日志中

* @param p_Param2 是另外一个入口参数 ,它的值将被记录进入 日志中

***/

create or replace procedure testAssert2(p_Param1 int, p_Param2 varchar2) IS

v_CTX PLOG.LOG_CTX;

v_Year varchar2(4);

BEGIN

---设置日志信息的根结点名称

v_CTX := PLOG.init('测试信息');

---构造树型日志的第2级

PLOG.setBeginSection(v_CTX, 'procedure_testAssert2_测试信息');

PLOG.setBeginSection(v_CTX, '检测入口参数');

--如果 p_Param1<=1,那相关信息就将写入日志

PLOG.ASSERT(v_CTX, p_Param1 > 1, 'p_Param1>1 always false');

--如果 p_Param2'man',那相关信息就将写入日志

PLOG.ASSERT(p_Param2 = 'man', 'p_Param2 man ');

---关闭树型日志的第2级目录

PLOG.setEndSection(v_CTX, '检测入口参数');

---下面是根据实际业务需要进行一序列处理

null; ---这里是一些业务处理代码

---end 相关实际业务处理

---检查业务处理结果

--构造又一个2级树型日志目录

PLOG.setBeginSection(v_CTX, '检查业务处理结果');

---这里是根据实际需要,对相关处理结果的检查代码

select to_char(sysdate, 'YYYY') into v_Year from dual;

PLOG.assert(v_CTX,

v_Year = '',

'当前年份应该是=2003,实际是=' || v_Year);

---end 这里是根据实际需要,对相关处理结果的检查代码

--关闭当前的树型日志的第2级目录

PLOG.setEndSection(v_CTX, '检查业务处理结果');

PLOG.setEndSection(v_CTX, 'procedure_testAssert2_测试信息');

END;

Log4plsql的应用

由于PLOG 提供了assert的处理,因此可以考虑在存储过程和包中进行一些测试结果的检查,根据需要把测试结果保存下来,对于一些基于算法的存储过程的测试,可以考虑使用一些脚本来做一些自动化的回归测试,

应用例子

1.说明:

这个例子可能不能应用起来(没有相关的数据库环境,缺少相应的包),但是可以open一些脚本出来,来说明相关的表达意思。如果是公司内部,可以在福州项目数据库下可以运行起来。

2.参考文档

参考 带申请的业主整合算法的测试,有申请,没有产权阁楼,没有产权分摊,不存在人口安置。

相关存储过程/包

PKG_ConDebugInfo.Normal_OwnerReq_Recursive

PLOG包

相关文档

参考《测试__带申请的业主整合算法的测试.doc》

测试数据的输入,采用手工的方式输入,根据需要也可以全部脚本生成。

参考文档《测试__带申请的业主整合算法的测试.doc》列出的测试数据要求。

测试数据的动态修改/生成,根据测试用例,动态改变/生成测试数据。

参考 PKG_ConDebugInfo.Normal_Owner_UpdateData3

测试结果的检查

参考 PKG_ConDebugInfo.Normal_Owner_Check_Data3

扩展

为了基于pl/sql的测试信息做的更好。可以从以下几个方面来做。

1.可以考虑自己去修改 Log4plsql提供的PLOG包,

1.1修改数据表TLOG,增加一些字段保存其他信息(比如:可以保存客户端IP)。

修改存储过程PLOG.addRow ,把相关信息保存到测试数据表。

可以从后台获取一些运行环境信息,比如采取下面的类似方式获取一些信息

SYS_CONTEXT('USERENV','CURRENT_USER')

SYS_CONTEXT('userenv', 'ip_address')

1.2增加其他一些方法

根据实际需要可以往PLOG包增加其他一些方法,比如日志的删除之类的。

最好还是另外包装1层,象上面的Oracle包PKG_ConDebug一样,定义1个包来做一些相关包装。

2.修改视图 VLOG,按照具体要求来现显示一些测试结果信息。

例如:创建下面的视图。

create or replace view vlog2 as

select

LUSER 数据库用户,

plog.getLevelInText(llevel) as 测试信息等级,

LSECTION 日志目录,

LTEXTE 错误信息,

LDATE 产生错误时间

from tlog a

3.算法测试的自动化

可以根据需要,增强上面Log4plsql的应用中关于测试数据的生成部分,并且做到据根据业务需要,测试测试数的生成可以带有随机性。或者按照关键用例为主来生成测试数据。

篇8:一个高效的分页存储过程

一个高效的分页存储过程

最近在做一个几百万条数据的分页查询,研究了各种方案,在本机上用项目的实际数据库做测试,测试过程 is very 痛苦,不堪回首ing,现在废话不多说,直接上结果,相信这也是大多数搜索答案的人最愿意看的方式。

以下是存储过程的代码:

1 CREATE PROCEDURE [dbo].[P_GridViewPager] (

2  @recordTotal INT OUTPUT,      --输出记录总数

3  @viewName VARCHAR(800),    --表名

4  @fieldName VARCHAR(800) = '*',    --查询字段

5  @keyName VARCHAR(200) = 'Id',      --索引字段

6  @pageSize INT = 20,          --每页记录数

7  @pageNo INT =1,          --当前页

8  @orderString VARCHAR(200),    --排序条件

9  @whereString VARCHAR(800) = '1=1'    --WHERE条件

10 )

11 AS

12 BEGIN

13   DECLARE @beginRow INT

14   DECLARE @endRow INT

15   DECLARE @tempLimit VARCHAR(200)

16   DECLARE @tempCount NVARCHAR(1000)

17   DECLARE @tempMain VARCHAR(1000)

18   --declare @timediff datetime

19

20   set nocount on

21   --select @timediff=getdate --记录时间

22

23   SET @beginRow = (@pageNo - 1) * @pageSize  + 1

24   SET @endRow = @pageNo * @pageSize

25   SET @tempLimit = 'rows BETWEEN ' + CAST(@beginRow AS VARCHAR) +' AND '+CAST(@endRow AS VARCHAR)

26

27   --输出参数为总记录数

28   SET @tempCount = 'SELECT @recordTotal = COUNT(*) FROM (SELECT '+@keyName+' FROM '+@viewName+' WHERE '+@whereString+') AS my_temp'

29   EXECUTE sp_executesql @tempCount,N'@recordTotal INT OUTPUT',@recordTotal OUTPUT

30

31   --主查询返回结果集

32   SET @tempMain = 'SELECT * FROM (SELECT ROW_NUMBER() OVER (order by '+@orderString+') AS rows ,'+@fieldName+' FROM '+@viewName+' WHERE '+@whereString+') AS main_temp WHERE '+@tempLimit

33

34   --PRINT @tempMain

35   EXECUTE (@tempMain)

36   --select datediff(ms,@timediff,getdate()) as 耗时

37

38   set nocount off

39 END

40

41 GO

完工!

篇9:如何测试mysql触发器和存储过程

-03-03mysql 字符串函数收集比较全

-08-08MySQL 有输入输出参数的存储过程实例

-04-04MySQL查询优化:连接查询排序limit(join、order by、limit语句)介

2013-05-05基于mysql事务、视图、存储过程、触发器的应用分析

-03-03mysql 跨表查询、更新、删除示例

2010-11-11mysql的日期和时间函数

-11-11MySQL优化全攻略-相关数据库命令

-07-07you *might* want to use the less safe log_bin_trust_function

2013-11-11mysql获取字符串长度函数(CHAR_LENGTH)

2013-05-05MySQL笔记之修改数据的解决方法

篇10:如何测试mysql触发器和存储过程

最近更 新

mysql中IFNULL,IF,CASE的区别介绍

解决远程连接mysql很慢的方法(mysql_conn

MySQL 相关的环境变量

MySQL笔记之运算符使用详解

jdbc调用mysql存储过程实现代码

mysql执行时间为负数的原因分析

Mysql在debian系统中不能插入中文的终极解

关于mysql innodb count(*)速度慢的解决办

Last_Errno: 1062,Last_Error: Error Du

MySQL无法启动1067错误的又一种解决方法(

热 点 排 行

mysql安装图解 mysql图文安装教程

超详细mysql left join,right jo

Can''t connect to MySQL server

Mysql命令行导入sql数据

MYSQL 数据库导入导出命令

Mysql字符串截取函数SUBSTRING的

MySQL数据库备份与恢复方法

MySQL server has gone away 问题

windows下mysql忘记root密码的解

MySQL日期数据类型、时间类型使用

读书笔记MySQL存储过程存储函数

浅谈触发器和存储过程

存储过程同函数的区别

编写安全的SQL Server扩展存储过程数据库教程

自动生成对表进行插入和更新的存储过程的存储过程数据库教程

存储虚拟化技术

网络存储技术论文

智能网络存储方案

我的成长过程作文

DELPHI 调用 Oracle 存储过程并返回数据集的例子.数据库教程

《关于存储过程分页,我的测试情况(精选10篇).doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式

点击下载本文文档