9.2.2 自含式方式及T-SQL
9.2.2.1 自含式SQL概述
在数据交换与扩展中自含式SQL是嵌入式SQL的一种发展,在开始时它应用于单机集中式方式中作为开发应用的主要手段,目前在C/S及B/S结构中它定位于服务器内,用于在服务器内的数据交换及扩展应用,基本不需连接,但需要作SQL访问与程序间的接口。目前自含式SQL主要用于服务器中的应用程序编制,如存储过程、函数的程序编制以及后台脚本程序编制。
一个完整的自含式SQL大致包括如下内容:
(1)SQL的基本内容:SQL的数据定义、数据操作及数据控制等内容。
(2)传统算法程序设计语言中的一些主要成份:如控制类语句、输出语句等。
(3)SQL中数据交换部分内容:包括游标、诊断等。
(4)服务性内容:服务性的函数库、类库、过程以及输入、输出、加载、拷贝、监控与图形、图像等多媒体服务功能等。
自含式SQL构成一种完整的语言,它将传统的程序设计语言与SQL相结合,其数据同时具有集合量与标量形式,而访问数据库则采用游标方式。这种语言可以编程,它们以过程或模块形式长久存储于服务器内并供应用程序调用。
目前自含式SQL已逐渐取代嵌入式SQL成为数据库应用开发中的主要工具之一。
在标准SQL中自含式SQL称为SQL/PSM(persistentstorage module)即SQL持久存储模块,此外在数据库产品中均有其企业级自含式SQL标准,它们与SQL/PSM有一定符合度,在本章中主要介绍SQLServer 2000中的自含式SQL语言T-SQL。
9.2.2.2 T-SQL介绍
这节主要介绍SQL Server 2000中的自含式语言Transact-SQL,简称T-SQL。TSQL将SQL与算法语言中的主要成份结合于一起,并通过游标建立无缝接口,从而构成一个跨越数据处理与流程控制的完整的语言,它包括如下内容:
●数据类型、变量与表达式。
●核心SQL操作。
●数据交换中的游标、诊断操作。
●程序流程控制与输出语句。
●函数。
●文本、图像操作。
下面我们对其作介绍。
1)数据类型、变量与表达式
(1)数据类型
SQL Server 2000的数据类型共有21种,它们可见表5.1。
(2)变量
SQL Server允许使用局部变量和全局变量,局部变量用DECLARE语句说明,而全局变量由系统预先定义和维护。
①局部变量:局部变量是用户可自定义的变量,它的作用范围仅在程序内部。局部变量在程序中通常用来存储从表中查询到的数据或当作程序执行过程中暂存变量。局部变量必须用@开头,而且必须先用DECLARE命令说明后才可使用。
变量说明的命令格式为:
DECLARE@<变量名><变量类型>[,@<变量名><变量类型>…]
变量名前必须有@前缀;主变量必须有冒号(:);前缀具有同样的功能,以便与关系表中的列名相区分,其中变量类型可以用SQL Server 2000支持的所有数据类型。
②全局变量:全局变量是由系统预先定义和维护的,它们不用说明就可以直接使用,全局变量的特征有两个@作前缀,即@@。全局变量主要用来记录SQL Server 2000的运行状态和有关信息。
③变量的赋值:在T-SQL中变量赋值必须使用SELECT或SET语句来设定变量值。
a.用SELECT语句:
SELECT@<变量名>=<表达式>[,@<变量名>=<表达式>…]
或:
SELECT@<变量名>=<表达式>[,@<变量名>=<表达式>…]
FROM<表名>|<视图名>…[,<表名>|<视图名>…]
b.用SET语句:
SET@<变量名>=<变量值>
(3)运算符
T-SQL中的运算符有算术运算符、比较运算符、逻辑运算符、字符串运算符等四种。
①算术运算符:T-SQL中可以使用的算术运算符,它们共有五种,它们是:加(+)、减(-)、乘(*)、除(/)及取模(%)。
②比较运算符:T-SQL中可以使用的比较运算符共有八种。它们是:等于(=)、大于(>)、小于(<)、大于等于(≥)、小于等于(≤)、不等于(!=)或(<>)、不大于(!>)及不小于(!<)。
③逻辑运算符:T-SQL中可以使用的逻辑运算符共三种,它们是逻辑与(AND)、逻辑或(OR)及逻辑非(NOT)。
④字符串运算符:在SQL Server中可以用算术运算符的加号(+)作字符串的连接运算。
(4)表达式
表达式由常量、变量、属性名或函数通过与运算符的有机结合构成各类表达式。常用的表达式类型如下:
①数值型表达式例如:x+2、y+6。
②字符型表达式例如:′中国首都-′+′北京′。
③日期型表达式例如:#2002-07-01#-#1997-07-01#。
④逻辑关系表达式例如:工资>=1200AND工资<1800。
(5)注释符
在Transact-SQL中可使用二类注释符:
①ANSI标准的注释符“――”用于单行注释。
②与C语言相同的程序注释符号,即“/*……*/”,“/*”用于注释文字的开头,“*/”用于注释文字的结尾,可在程序中表示多行文字的注释。
2)核心SQL操作
在T-SQL中可以对核心SQL中的语句做操作,它们包括下面一些语句。
(1)数据定义类语句
包括数据库定义(即数据模式定义)、表定义、索引定义、视图定义、存储过程定义以及相应的删除语句和部分修改语句。
(2)数据操纵类语句
包括SELECT语句的各种类型数据操纵语句。
(3)数据控制类语句
包括GRANT、REVOKE等授权类语句以及关于事务类语句和规则、缺省值定义语句等。
在T-SQL编程中主要使用数据操作语句。
3)数据交换操作
在T-SQL中的数据交换操作主要是游标操作与诊断操作。
(1)游标
T-SQL中的游标共有五条语句,它们是:
①DECLARE CURSOR语句
DECLARE CURSOR语句的格式是:
这里的INSENSITIVE表示用数据的临时拷贝来定义游标,所有对游标的请求都反映在这个临时表上,因为这时的游标实际上是不允许修改的。
这里SCROLL表示可使用包括NEXT、PRIOR及FIRST等在内的所有提取项操作,FOR READ ONLY或FOR UPDATE说明游标为只读的或可修改的。
②OPEN语句
OPEN语句的格式是:
OPEN<游标名>
③FETCH语句
FETCH语句的格式是:
此语句先移动指针,然后取出指针所指向的数据元组中的数据并放入INTO后变量中。
④CLOSE语句
CLOSE语句的格式是:
CLOSE<游标名>
⑤DEALLOCATE语句
DEALLOCATE语句的格式是:
DEALLOCATE<游标名>
该语句的功能是删除由DECLARE说明的游标。该语句不同于CLOSE语句,CLOSE语句只是关闭游标(文件),需要时还可以重新打开;而DEALLOCATE语句则要释放和删除与游标有关的所有数据结构和定义。
(2)诊断
在T-SQL中其诊断值存放于全局变量fetch-status中,可用它来获得诊断结果,当它为0时表示FETCH执行成功,否则则不成功。下面用一个例子来说明。
应用游标与诊断的配合使用可以有效的建立应用与数据库间的数据接口。下面是它的一个应用实例。
例9.1 关于游标应用的实例。
4)算法程序设计语言中的程序流控制及输出语句
它们包括九条语句:
(1)BEGIN…END语句
它可将多条语句封装形成语句块,并将它们视为一个处理单元。
(2)IF…ELSE语句
条件判断语句,根据条件的真、假选择性执行。其中IF后跟以条件表达式,当条件为真时顺序执行,当为假时则执行ELSE后的语句。该语句一般形式为:
IF<条件表达式>
<语句1>
[ELSE<语句2>]
(3)CASE语句
根据搜索条件选择性执行。CASE语句可实现多分支选择,它有两种格式,它们是:
●简单格式
CASE<input表达式>
WHEN<when表达式>THEN<result表达式>
[…n]
[ELSE<else result表达式>]
其含义是当input表达式=when表达式取值为真时,则执行<result表达式>,否则执行<else result表达式>,如无else字句则返回NULL。
●搜索格式
CASE<WHEN表达式>THEN<result表达式>
[…n]
[ELSE<else result表达式>]
其含义是当<WHEN表达式>为真时则执行<result表达式>,为假时则执行<else result表达式>,如无else子句则返回NULL。
(4)WHILE…BREAK…CONTINUE语句
设置一个反复执行语句块,直至条件不满足为止。
其中WHILE后跟以条件表达式,只要条件为真就可重复执行后面的语句,CONTINUE语句可以使程序跳过它后面的语句回到循环的第一行语句。BREAK语句使程序跳出循环,结束WHILE语句执行。该语句的一般形式为:
WHILE<条件表达式>
<语句>
[BREAK]
<语句>
[CONTINUE]
(5)GOTO语句
无条件转移语句。其形式为:GOTO<标号>。表示无条件转换标号开始后的语句。
(6)WAITFOR语句
暂停程序执行直至所设定的时间或等待时间已到才继续执行。
(7)RETURN语句
返回语句,结束当前程序执行并返回至原调用处,该语句在返回时可指定一个返回值,若未指定返回值则系统会自动返回一个值,其中0表示执行成功而负整数则表示不成功。
(8)PRINT语句
打印输出语句。该语句的形式如下:PRINT‘字符串’|@<局部变量>|@@<全局变量>
(9)RAISERROR
出错时输出用户定义的出错信息。
5)函数
T-SQL提供大量函数,它们可分为若干类:
(1)查询汇总函数
它包括SQL查询中的总计函数:COUNT、SUM、AVG、MAX及MIN等。
(2)类型转换函数
将表达式结果从一种类型转换成另一种类型。
(3)日期函数
有关日期计算的一些函数。
(4)数学函数
有关对数、指数、平方、平方根、三角函数、取整、取绝对值、弧度角度转换等函数。
(5)字符串函数
有关字符串转换的一些函数。
(6)系统函数
用于从数据库中返回一些特定信息的系统函数。
(7)图像函数
有关文本、图像数据处理的函数。
6)文本、图像操作
T-SQL提供若干文本与图像的操作语句,它们是:
(1)READTEXT语句
从文本或图像中读取数据。
(2)WRITETEXT语句
将数据写入文本或图像中。
(3)UPDATETEXT
修改文本或图像中数据。
9.2.2.3 存储过程
用T-SQL中的语句可以编程,它们以过程形式出现并存储于服务器内,因此称为存储过程。存储过程有两种,一种是系统存储过程,它由系统统一给出;另一种是自定义存储过程,它可由用户自己定义与使用,它简称存储过程。
存储过程的具体构作与使用如下:
1)存储过程的构作
存储过程是一个过程,它由过程名、参数与过程体三部分组成,其中过程体是带有若干个SQL语句的程序,它由用户用T-SQL编写后以执行码形式存放于数据库中,供用户使用。在数据库中创建存储过程可用下面的语句:
CREATE PROCEDURE<存储过程名>(<参数表>)AS<过程体>
其中<参数表>可以由若干个@<参数名><参数类型>组成,此外还可以是:@<参数名>=<默认值>以及<output>,它是一个返回参数值。
其中<过程体>则是一个用T-SQL编程的程序。
也可用下面的语句撤消已创建的存储过程:
DROP PROCEDURE<存储过程名>
2)存储过程的使用
在T-SQL中调用存储过程的形式为:EXECUTE<<存储过程>>(<参数表>)。
在应用程序中须调用存储过程时可用此语句,最终并可以返回执行结果,其具体执行方式是在过程体末设置return语句,在执行时return语句若执行成功则返回0,若不成功则返回出错码。
存储过程使用简单,效果良好,它目前已成为网络环境下数据库操作中的常用方法,存储过程有如下优点:
(1)减少网络负担
由于服务器只是将存储过程执行结果一次性返回给客户端,而不需要每执行一条SQL语句在网上就做一次交互,因此极大的减少了数据在网络上的传递,减轻了网络负担。
(2)提高了系统执行效率
由于存储过程完全在服务器上执行,从而减轻了客户端的压力,而且由于减少大量的数据通讯时间,因此提高了整个系统的执行效率。
(3)扩大了共享资源
存储过程作为服务器中数据库的一种资源,它的共享程度高,因此使数据库不但达到数据资源共享,也达到了“过程”资源共享。
下面给出用T-SQL编写的存储过程例子
例9.2 创建一个名为Insert-Record的存储过程,其功能是向表S中插入一条记录,记录值由参数提供,创建存储过程的语句如下:
接着给出一个调用存储过程的例子。
例9.3 调用存储过程Insert-Record,其参数为:sno=′1357′,sn=′王平′,sd=′CS′,sa=′18′,其调用语句为:
EXECUTE Insert-Record(@sno=′1357′,@sn=′王平′,@sd=′CS′,@sa=′18′)
在国际SQL标准中也有存储过程的功能。
9.2.2.4 函数
在SQL Server 2000中有函数功能,函数有两种,一种是系统函数,它由系统统一给出;另一种是自定义函数,它可由用户自己定义与使用,它简称函数。
1)函数的构作
一个函数可以用创建函数建立,其形式如下:
CREATE FUNCTION<函数名>(<参数表>)AS<函数体>
在该语句中的函数体是由T-SQL编写而成。一个函数创建后即保存于系统中,并随时可以使用,它同时也可以用下面的语句撤销已创建的函数:
DROP FUNCTION<函数名>
2)函数的使用
函数可以使用于SQL语句中的任何部位,只要在该部位给出:<函数名>(<参数表>)即可。
在国际SQL标准中也有函数的功能。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。