db2分页sql语法

2024-04-19

db2分页sql语法(精选6篇)

篇1:db2分页sql语法

int startPage=1 //起始页

int endPage;  //终止页

int pageSize=5; //页大小

int pageNumber=1 //请求页

startPage=(pageNumber-1)*pageSize+1

endPage=(startPage+pageSize);

select * from (select 字段1,字段2,字段3,字段4,字段5,rownumber()

over(order by 排序字段 asc ) as rowid from 表名 )as a where a.rowid

>= startPage AND a.rowid< div=“”>

//以下sql表示取5条数据 从1取到5

select * from (select dslsid,zzjgdm,frmc,frlx,mc,frzs,fddbrxm,clrq,frzch,nsrglm,

swdjrq,bgbs,bgcz,bgrq,swdjjgdm,orgdeptname,nsrsbh ,rownumber()

over(order by dslsid asc ) as rowid from FR_V_DSLS )as a

where a.rowid BETWEEN 1 AND 6

不好意思,犯了个低级错误,上面的sql语句是有误的,原因在于对

between and的错误理解

本人记得between and是包含前者,不包含后者,实验表明,

between and 前后两者都包含,

db2分页sql语法

所以上述语句应修改为:

select * from (select dslsid,zzjgdm,frmc,frlx,mc,frzs,

fddbrxm,clrq,frzch,nsrglm,swdjrq,

bgbs,bgcz,bgrq,swdjjgdm,orgdeptname,nsrsbh ,rownumber()

over(order by dslsid asc ) as rowid from FR_V_DSLS )as

a where a.rowid >= 1 AND a.rowid < 6

留着上面的语句加深印象。

篇2:db2分页sql语法

SELECT *

FROM (SELECT row_number OVER () AS rown, CC_BRAND.*

FROM CC_BRAND

ORDER BY CC_BRAND.BRAND_CODE) AS A

WHERE a.ROWN >= 1 AND a.ROWN <= 10;

我的思路是这样的:

我把第一种分页SQL中红色标注部分的运行结果当做一个结果视图,然后再对它里面的ROWN字段进行有选择查询

我感觉这是没有任务问题的,但结果却是错误的。不解呀

运行红色标注部分,运行完全正确,但全部运行就不对了,排序错乱了,和红色标注部分的排序结果完全不一样,很让我不解,

最后在网上查找了“排序分布”的例子,修改一下就好了 --

如下:

SELECT *

FROM (SELECT row_number () OVER (ORDER BY CC_BRAND.BRAND_CODE) AS rown,

CC_BRAND.*

FROM CC_BRAND) AS A

WHERE a.ROWN >= 1 AND a.ROWN <= 10;

蓝色标注部分就是不一样的地方,要把排序放在over后面的括号里面,

这样才能正确排序分页,

篇3:db2分页sql语法

关键词:嵌入式,静态SQL,游标

1 概述

一个嵌入式SQL应用程序文件就是一个含有SQL语句,且带有特殊扩展名的文该文件。在开始进行嵌入式SQL应用程序开发前,首先需要了解如何把这样一个文件转化成宿主语言编译器可以识别和处理的格式,如何同数据库服务器进行交互、对数据进行查询修改和删除等操作,以及如何构建可执行的程序,文章源代码均用C语言。

2 构建嵌入式SQL应用程序过程

建立一个嵌入式SQL应用程序前,我们应对其用发中常用的基本概今有一定了解,其具体步骤分为:

2.1 开发环境

使用文本编辑器或者集成开发环境(IDE)编辑源文件。

2.2 预编译

在程序文件编辑完成后,应预编译每个连接到数据库的源程序文件。无论是嵌入式静态SQL还是嵌入式动态SQL,都需要先进行预编译,并绑定到特定的数据库。它将源文件中的SQL语句注释掉,并把SQL语句替换成DB2运行时的API调用,这些API调用是源语言编译器能够理解的函数调用,预编工作由预编译器来完成。

预编译命令:

Precompile filename[参数名可用数值]…

PREP filename[参数名可用数值]…

如创建一个默认名为test.c的新C源文件,同时会生成一个名为test.bnd的绑定文件。其在DB2窗口下执行命令为:

常用参数列表如表1。

2.3 编译

使用主语主编译修改后的源文件,以及其他不包含SQL语句文件。

2.4 链接

将编译生成的目标文件与DB2链接到主语言库,从而产生一个可执行的文件。

2.5 绑定

创建程序句过程中,数据库管理器在执行程序时会调用这些程序包,为执行提供访问数据策略与路径。在预编译时指定PACKAGE选项隐含的完成;或者用BIND命令通过预编译产生的绑定文件显性的完成。

BIND其绑定命令格式为:

BIND filename[参数名数值]…

例如将名为test.bnd绑定到数据库中,其在DB2窗口下执行命令为:

预编译为每一个需要独立预编译的源代码模块创建一个程序包。如果有4个源文件,这4个源文件都需要预编译,那么就要创建4个程序包或者4个绑定文件。默认方式是,每一个程序包的名字与后缀.bnd的源文件名字相同,但只包含前8个字符。如果新建的程序包名字与已存在于数据库中的程序包名称相同,新的程序包将替换原先存在的程序包,要显性的指定一个不同的程序包名称,必须执行PREK命令时使用PACKAGE USING选项。

3 嵌入式静态SQL

3.1 静态SQL程序的结构与特点

静态SQL是指嵌入在宿主语言中的SQL语名在预编译时完全知道。其特点如下:

1)SQL语句直接嵌入到宿主编程语言,程序需要预编译处理这些嵌入的SQL语句

2)SQL语句在程序被编译时已知,涉及的数据库对象已存在

3)SQL语句在程序运行前被编译

4)SQL语句的编译结果在DB2的目录(catalog)中持久化保存运行时仅读取目录(catalog)

5)SQL语句的优化是根据编译时的数据库统计信息进行的,不能完全反映运行时的情况

6)对SQL语句所访问的数据对象的权限检查是在绑定时进行的权限控制的粒度是包(package,一组SQL语句的编译结果),用户仅需要访问包的权限

7)如果SQL语句中的对象被修改,如DDL执行,整个包都需要重新绑定

3.2 宿主变量声明与使用

通常方法声明的变量不能被SQL语句直接引用,以另一种特殊的方式在宿主语言程序模块中声明,必须在BEGIN DECLARE SECTION和END DECLARE SECTION程序段中定义。以下程序显示了在C语言中声明宿主变量的例子:

3.3 指示符变量的定义与使用

与宿主变量定义方法相同,在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义。并且数据类型与SQL数据类型SMALLINT对应,在C语言中为short类型。在INSERT语句句用宿主变量,其需要嵌入的SQL语句为:

第一条SQL语句可以在CLP中发出,它也可以嵌入到应用程序中,但是它每一次只能插入一行值,如果要插入不同的值就要重新输入,程序过程也要修改。第二条SQL语句只能嵌入在程序中,每一次执行需要用户通过其他代码指定新值给宿主变量empno和name,宿主变的量的作用是将用户指定的值传递给VALUES子句。可以实现输入多行值。

宿主变量使用方法如下例子:

3.4 游标的定义与使用

与宿主变量定义方法相同,在BEGIN DECLARE SECTION和END DECLARE SECTION之间定义。一个应用程序可以有多个游标,但第个游标都要有自己的DECLARE,CURSOR,OPEN,FETCH和CLOSE语句集;处理一个游标涉及到以下几个步骤。

1)使用DECLARE CURSOR语句声明一个游标。

2)使用OPEN语句执行查询和创建结果表。

3)使用FETCH语句每次提取一行结果。

4)使用DELETE或UPDATE语句处理行(如果需要)。

5)使用CLOSE语句关闭游标。

DECLARE和静态SELECT语句关联

3.5 构建嵌入式静态SQL应用程序

下面通过例程演示了静态SQL语句的使用,实现至多一行的查询,程序查询语句通过SELECT INTO来执行,然后将这数据赋予程序中指定的宿主变量。一条SELECT INTO语句必须只能返回一行或者0行,如果结果集多于一行,就会产生一个错误(SQL-CODE-811,SQLSTATE 21000)。

4 结论

针对嵌入式静态SQL应用与开发,在通常情况下:程序需要处理SQL语句频率较高,压力大或SQL语句较为简单且已知不变的,可以选用静态SQL开发;目前,商业DB2应用程序采用的大多是静态SQL,特点是一次BIND,多次稳定运行,省去了数据库每次寻找的,并且,如果环境迁移,只须重新,而不需要重新编译应用程序或该产品配置。

参考文献

[1]管松,肖振春,张建伟,等.DB2V9/9.5高级应用开发[M].北京:电子工业出版社,2009.

[2]刘耸柏.DB2入门与提高[M].北京:清华大学出版社,2002.

篇4:Sql分页查询效率分析

表test中有1000条数据,2个字段:field1(int),field2(nvarchar)

--1000条数据,查询500次第1-10行,39s

--1000条数据,查询500次第500-550行,87s

--1000条数据,查询500次第150-160行,88s

DECLARE @uId int

SET @uId=1 BEGIN while @uId<=500 BEGIN

SELECT *

FROM (

SELECT row_number() over(

ORDER BY [dbo].[test].[filed1] desc) as rownum,* from [dbo].[test]) temp

WHERE temp.rownum BETWEEN 150 AND 160;

SET @uId=@uId+1 END END;

--1000条数据,查询500次第1-10行,78s

--1000条数据,查询500次第500-550行,78s

DECLARE @uId int

SET @uId=1 BEGIN while @uId<=500 BEGIN

SELECT *

FROM [dbo].[test]

ORDER BY [dbo].[test].[filed1] DESC

OFFSET (10 * (15 - 1)) ROWS FETCH NEXT 10 ROWS ONLY

SET @uId=@uId+1 END END

测试效果:

row_Number()不稳定,考前的记录查询比较快,靠后的记录查询时间会增加

OFFSET FETCH 稳定,考前靠后的查询时间都是基本一样

篇5:db2分页sql语法

这都微软的数据库,都是一家人,基本的操作都是差不多,常采用如下分页语句:

PAGESIZE:每页显示的记录数

CURRENTPAGE:当前页号

数据表的名字是:components

索引主键字是:id

以下是引用片段:

select top PAGESIZE * from components where id not in

(select top (PAGESIZE*(CURRENTPAGE-1))

id from components order by id)order by id

如下列:

以下是引用片段:

select top 10 * from components where id not in

(select top 10*10 id from components order by id)

order by id

从101条记录开始选择,只选择前面的10条记录

2、Oracle数据库

因为Oracle数据库没有Top关键字,所以这里就不能够像微软的数据据那样操作,这里有两种方法:

(1)、一种是利用相反的,

PAGESIZE:每页显示的记录数

CURRENTPAGE:当前页号

数据表的名字是:components

索引主键字是:id

以下是引用片段:

select * from components where id not

in(select id from components where

rownum<=(PAGESIZE*(CURRENTPAGE-1)))

and rownum<=PAGESIZE order by id;

如下例:

以下是引用片段:

select * from components where id not in

(select id from components where rownum<=100)

and rownum<=10 order by id;

从101到记录开始选择,选择前面10条,

(2)、使用minus,即中文的意思就是减去。

以下是引用片段:

select * from components where rownum

<=(PAGESIZE*(CURRENTPAGE-1)) minus

select * from components where rownum

<=(PAGESIZE*(CURRENTPAGE-2));

如例:select * from components where

以下是引用片段:

rownum<=10 minus select * from components

where rownum<=5;.

(3)、一种是利用Oracle的rownum,这个是Oracle查询自动返回的序号,一般不显示,但是可以通过select rownum from [表名]看到,注意,它是从1到当前的记录总数。

以下是引用片段:

select * from (select rownum tid,components.

篇6:db2分页sql语法

关键词:DB2数据库,嵌入式SQL语言,预编译,绑定

1 引言

2009年6月26日, IBM在北京发布了DB2最新版本DB2 9.7, 这款代号为“Cobra”的最新版提供了三大新特性:特性一, 凭借DB2和InfoSphere Warehouse软件的创新特性, 大幅减少了数据存储空间, 有效地节约了时间、能源、部署及开发成本, 可帮助客户节约高达75%的相关成本;特性二, 是业内首款能够同时为关系型数据和XML数据提供业务分析功能的数据库软件。企业可充分利用硬件来提高管理效率, 并从有价值的XML数据信息中发掘商业价值;特性三, 携手开源数据库厂商EnterpriseDB, 通过其Postgres Plus平台兼容Oracle数据库, 使客户能够在DB2上运行专为Oracle数据库编写的程序, 大大地降低了迁移的成本、时间和风险[1]。DB2因此受到业界和客户越来越多的关注和信任, 本文所探讨的嵌入式SQL (Structured Query Language, SQL) 应用程序都是基于DB2 V9.7, 并且其开发的程序已经应用于宝钢的计算机控制系统, 效果明显。

DB2本身没有属于自己专有的程序设计语言, 它只是允许通过多种方式传递SQL语句来操纵数据, 且相应地提供一系列应用程序的编程接口来管理和执行数据库操作。目前, DB2提供两种应用开发方式:基于驱动的API编程和嵌入式SQL编程, 本文详细讨论的是嵌入式SQL编程的开发方式。

2 构建嵌入式SQL应用程序

2.1 嵌入式SQL语言

结构化查询语言是用于操纵数据库对象及其所包含数据的标准化语言。SQL由多个不同的语句构成, 这些语句用来定义、更改和销毁数据库对象, 以及添加、修改、删除和检索数据值。但是, SQL是非过程的, 所以它不是一种通用的编程语言。因此, 常常通过将高级编程语言的决策和序列控制与数据存储、操纵和检索等SQL功能组合起来, 开发出数据库应用程序。可以用多种方法将SQL与高级编程语言 (主要包括C/C++、Java、COBOL、Fortran) 结合起来, 但最简单的方法是将SQL语句直接嵌入用于创建应用程序的高级编程语言源代码文件中, 该技术被称作嵌入式SQL编程, 嵌入的语言也被称为宿主语言[2]。如无特殊说明, 本文下面所引用的应用实例其宿主语言都是C/C++。

嵌入SQL有其优势, 它可以包含静态SQL或动态SQL, 或两者类型混合使用。静态SQL语句是一种可以在开发时在应用程序中进行硬编码的SQL语句, 因为关于它的结构和要与之交互的对象 (例如表、列和数据类型) 的信息事先就知道, 所以分析语句以及选择最优化的数据访问计划等工作由DB2优化器在开发过程中执行, 效率高且执行速度快。动态SQL语句相对灵活, 它们可以在应用程序运行时进行构造, 且与之进行交互的对象的信息不必事先知道, 但是优化等系列的工作是在程序运行时进行, 所以执行时间较长。

2.2 宿主变量和指示符变量

DB2 Database Manager是依靠宿主变量在应用程序和数据库之间移动数据, 需要在声明段的专用区域中定义宿主变量, 并以BEGIN DECLARE SECTION和END DECLARE SECTION作为开头和结尾的标志, 用来区分宿主变量和其他高级编程语言变量。

在定义宿主变量时, 必须使其数据类型和长度与它们将要操作的列的数据类型和长度相兼容, 且每个宿主变量指定一个唯一的名称, 同一文件中不允许使用重复的名称[3]。

指示符变量是一种特殊的宿主变量类型, 用来判定列是空值或非空的标志。DB2在执行select和fetch的语句中设置指示符变量, 在执行update和insert语句时, 根据指示符变量的值判定是否在数据库中放置一个空值。指示符变量和宿主变量一样需要定义在专用区域, 且其类型要和DB2指派的DB2UDB SMALLINT数据类型兼容, 在C/C++语言中为short型。 (具体用法参看例1程序清单的声明部分)

2.3 游标的使用

当查询向应用程序返回多行时, DB2使用称为“游标 (cursor) ”的机制从所产生的结果数据集中检索数据值。如果要将游标包含在嵌入式SQL应用程序中, 就必须依次执行下列步骤:使用DECLARE CURSOR语句声明有表;使用open语句执行查询和创建接过表;使用fetch语句每次提取一行结果, 如果需要可使用delete或update语句处理行;使用close语句终止或关闭游标。根据程序的具体需求, 游标可以是只读的、可更新的或者是不明确的。如果在定义时只使用了select语句, 就表明是只读类型游标;如果应用程序要修改提取的数据, 需要在定义时使用FOR update或在delete与update中使用WHERE CORRENT OF子句。对于未确定的游标, 当预编译或绑定时使用了BLOCKING ALL的选项, 游标被看作只读, 否则就是可更新的[4]。 (具体用法参看例1程序清单的游标的部分)

2.4 诊断和错误处理

在IBM的关系型数据库产品DB2中, 使用SQL Communication Area (SQLCA) 将程序中嵌套的SQL语句运行情况返回给程序。在程序中有针对性地对SQLCA实施调用, 可对程序中各类SQL语句的执行结果实施控制, 从而避免程序的意外终止。同时, 也可以提高运行效率, 减小系统开销和处理时间。DB2是通过函数sqlaintp来读取sqlca中SQL语句执行后的结果和错误。此函数定义在sql.h中, 格式如下:

其中, buffer为存放了sqlca信息的缓冲区;buffer_size中存放了buffer的长度;line_width存放了两个执行符之间的字符长度。函数返回值为正时代表sqlca信息的长度, 为负时代表没有sqlca信息返回。一般来讲, sqlca信息都可存放在长度为512个字节的缓冲区中。在对sqlca的调用中, 最常见的是通过访问sqlcode来实现。当返回值为+0时, 表明SQL语句执行成功;返回值为+100时, 表明满足检索条件的记录没找到。一般来说, 负的sqlcode返回值意味着SQL语句执行失败, 如当sqlcode的返回值为-911时, 表明系统检测到了死锁。 (具体用法参看例1程序清单中sqlaintp函数部分)

如果在执行每个SQL语句之后都检查SQL返回码可能给应用程序增加额外的开销, 所以可以让预编译器自动生成用以检查SQL返回码的源代码, 通常是通过在源代码文件中嵌入一种或多种形式的WHENEVER SQL语句来完成的。其具体使用方法如下:

例1:程序名为test.sqc的代码清单如下:

(1) EXEC SQL WHENEVER SQLERROR action sqlcode<0时, 执行action。

(2) EXEC SQL WHENEVER SQLWARNINGaction sqlcode>0但不为100且SQLWARN[0]=W时, 执行action。

(3) EXEC SQL WHENEVER NOT FOUNDaction sqlcode=100时, 执行action。

其中, action有两种可能:a.CONTINUE:继续执行程序中的另一条命令;b.GO TO label:转到label指定的语句开始。 (具体用法参看例1程序清单中WHENEVEN的应用部分)

3 将嵌入式SQL应用程序转换成可执行程序的基本过程

含有SQL语句的源程序实际是无法直接被宿主语言的编译器处理的, 必须在创建与DB2数据库进行交互的应用程序之前, 通过预编译、绑定、编译和链接才能转换成可执行的应用程序。转换的基本过程如图1所示。

3.1 预编译

预编译是将源文件中的SQL语句注释掉, 替换成能被源语言编译器理解的API函数调用, 由专门的预编器完成, 因此在编译之前, 必须连接到一个实际的数据库服务器。预编译器在进行编译时, 需要创建DB2 Database Manager在处理某个SQL语句时需要的信息, 这些信息会存储在程序包、绑定文件等文件中。也就是说, 当我们执行完预编译命令后可能生成4类输出, 分别是:编译之后的源文件 (文件扩展名为c) 、程序包、绑定文件 (文件扩展名为bnd) 、消息输出文件。

源文件 (文件扩展名为sqc) 经过预编译命令 (db2prep) 之后, 会生成高级编程语言编译器所能识别的新的文件, 我们称之为编译之后的源文件;所有SQL语句在经过编译优化后就产生可以直接对数据库进行访问的访问策略, 这个策略可以存储在数据库的程序包内, 访问策略包含DB2 Database Manager用来执行SQL语句的优化的信息;静态SQL语句的访问策略是在预编译时产生的, 而动态SQL语句的访问策略是在应用程序运行时产生的;程序包可以在生成它们时存储在预编译器所使用的数据库中, 也可以将它们写入一个绑定文件, 以后在将该文件绑定到任何有效的DB2数据库中;在预编译过程中产生的信息 (包括警告信息和错误信息) 被重定向的文件称为消息输出文件。

3.2 绑定、编译及链接

将程序包存储到适当数据库中的这一过程称为绑定。绑定的过程可以在预编译时直接完成, 也可以使用bind命令, 利用预编译生成的绑定文件, 通过DB2 Binder工具完成延时绑定。预编译和绑定完成后, 再用高级编程语言编译器来编译预编译之后的源代码文件 (以及所需的其他源代码文件) , 生成目标文件, 最后再用链接器将目标文件与DB2和高级编程语言库连接, 生成最终的可执行文件。执行文件可以以共享库或动态链接库 (DLL) 的形式存在, 便于其他可执行应用程序可以加载和执行这些库。 (具体用法参看例2)

例2:生成执行程序的命令

4 结语

本文结合宝钢过程控制计算机系统的开发代码和开发经验, 讨论了针对DB2数据库进行嵌入式SQL编程的语法规则以及构造嵌入式SQL应用程序的基本步骤, 并进一步解析了将一个或多个包含嵌入式SQL的高级编程语言源代码文件转换成可执行应用程序的过程。本文所讨论的编程规则和编译方法已经广泛应用在宝钢二炼钢项目上, 该项目于2010年11月投产, 程序运行稳定, 响应时间短, 易于数据库管理, 有很大的兼容性和可扩展性。

参考文献

管松.DB2V9/9.5高级应用开发[M].北京:电子工业出版社, 2009.

程永.DB2V9权威指南[M].北京:电子工业出版社, 2009.]

吴骅.DB2 9 for Linux, UNIX, Windows数据库管理认证指南[M].北京:机械工业出版社, 2009.

上一篇:人最怕欺骗诗歌下一篇:六一儿童节庆祝大会优秀的发言稿