




已阅读5页,还剩103页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,第四章T-SQL程序设计基础,SQLServer数据类型SQLServerSQLServer函数T-SQL控制流程,2,系统数据类型,数据类型指定列、存储过程参数及局部变量的数据特性数据按照数据类型存储在列中系统数据类型:系统数据类型是SQLServer支持的内置数据类型,系统数据类型有25种。用户定义的数据类型:用户根据系统数据类型自己定义的数据类型,3,系统数据类型,4,系统数据类型,5,系统数据类型,6,系统数据类型,7,系统数据类型,8,系统数据类型,9,系统数据类型,10,系统数据类型,11,系统数据类型,12,系统数据类型,只有字符与二进制数据类型需要指定长度,其他如整型、日期时间、浮点数据类型,定义时不用指定长度,也就是长度是默认值。自定义数据类型建立在SQLserver系统数据类型基础上的。需要指定该类型的名称、建立在其上的系统数据类型及是否充许为空。可以用如下方法来创建自定义数据类型。,13,自定义数据类型,利用系统存储过程:sp_addtype。其语法为:sp_addtypetype,system_data_type,nulltype其中:type是用户定义数据类型的名称。数据类型名称必须遵循标识符规则,并且在每个数据库中必须是唯一的。system_data_type是SQLServer提供的数据类型,用户定义的数据类型即基于该类型。null_type:指定必须如何处理null值。null_type是varchar(8),设置值为NULL(默认)、NOTNULL或NONULL例:execSP_addtypetele,smallint,notnull,14,删除用户定义的数据类型,使用sp_droptype系统存储过程来撤销用户定义数据类型。例删除名为tele的用户定义数据类型:EXECsp_droptypetelephone,15,其它语言元素,批处理注释变量运算符函数流程控制语句,16,批处理,批处理:指包含一条或多条T-SQL语句的语句组,这组语句从应用程序一次性地发送到SQLServer服务器执行。执行单元:SQLServer服务器将批处理语句编译成一个可执行单元,这种单元称为执行单元。若批处理中的某条语句编译出错,则无法执行。若运行出错,则视情况而定。,17,书写批处理时,go语句作为批处理命令的结束标志。当编译器读取到go语句时,会把go语句前面所有的语句当作一个批处理,并将这些语句打包发送给服务器。注意:go语句本身不是T-SQL语句的组成部分,它只是一个用于表示批处理结束的前端指令。,18,建立批处理时注意,Createdefault、CreateRule、CreateTrigger和Createview等语句在同一个批处理中只能提交一个。不能在删除一个对象之后,再同一批处理中再次引用这个对象不能把规则和默认值绑定到表字段或者自定义字段上之后,立即在同一个批处理中使用它们。不能定义一个check约束之后,立即在同一个批处理中使用。,19,不能修改表中一个字段名之后,立即在同一个批处理中引用这个新字段。使用set语句设置的某些set选项不能应用于同一个批处理中的查询若批处理中第一个语句是执行某个存储过程的execute语句,则execute关键字可以省略。若该语句不是第一个语句,则必须写上。,20,例如:,UsepubsGoSelect*from员工数据表GoCreateviewpm_viewasSelect*from员工数据库where所属部门=项目部GoSelect*frompm_viewgo,21,注释,注释是程序代码中不执行的文本字符串(也称为注解)。在SQLServer中,可以使用两种类型的注释字符:一种是ANSI标准的注释符“-”,它用于单行注释;另一种是与C语言相同的程序注释符号,即“/*/”。例如:-检索部门的员工/*检索录入部的员工*/,22,变量,变量是一种语言中必不可少的组成部分。Transact-SQL语言中有两种形式的变量,一种是用户自己定义的局部变量,另外一种是系统提供的全局变量。,23,全局变量,全局变量是SQLServer系统内部使用的变量,其作用范围并不仅仅局限于某一程序,而是任何程序均可以随时调用。全局变量通常存储一些SQLServer的配置设定值和统计数据。用户可以在程序中用全局变量来测试系统的设定值或者是Transact-SQL命令执行后的状态值。,24,使用全局变量时注意,全局变量不是由用户的程序定义的,它们是在服务器级定义的。用户只能使用预先定义的全局变量。引用全局变量时,必须以标记符“”开头。局部变量的名称不能与全局变量的名称相同,否则会在应用程序中出现不可预测的结果。,25,error全局变量将返回最后执行的T-SQL语句的错误代码,数据类型为整型。在SQLServer执行一个T-SQL语句之后,若成功,则返回值为0;否则返回相应的错误代码。,26,局部变量,局部变量是一个能够拥有特定数据类型的对象,它的作用范围仅限制在程序内部。局部变量可以作为计数器来计算循环执行的次数,或是控制循环执行的次数。另外,利用局部变量还可以保存数据值,以供控制流语句测试以及保存由存储过程返回的数据值等。局部变量被引用时要在其名称前加上标志“”,而且必须先用DECLARE命令定义后才可以使用。,27,声明局部变量,其声明形式如下:DECLARE变量名变量类型,变量名变量类型其中变量类型可以是SQLServer2000支持的所有数据类型,也可以是用户自定义的数据类型,28,局部变量赋值,在Transact-SQL中,不能像在一般的程序语言中一样使用变量=变量值来给变量赋值,必须使用SELECT或SET命令来设定变量的值.其语法如下SELECT局部变量=变量值或SET局部变量=变量值,29,例:声明一个长度为10个字符的变量id并赋值declareidchar10selectid=10010001例:declaretemp_counterintSettemp_counter=0例:declaremax_salaryintSelectmax_salary=max(工资)From员工数据表注意:局部变量的作用范围是从声明该局部变量的地方开始,到声明局部变量的批处理或存储过程的结尾。在局部变量的作用范围以外引用该局部变量将产生语法错误。,30,运算符,运算符是一些符号,它们能够用来执行算术运算、字符串连接、赋值以及在字段、常量和变量之间进行比较。在SQLServer2000中,运算符主要有以下六大类:算术运算符、赋值运算符、位运算符、比较运算符、逻辑运算符以及字符串串联运算符。,31,1算术运算符,算术运算符可以在两个表达式上执行数学运算,这两个表达式可以是数字数据类型分类的任何数据类型。算术运算符包括加(+)、减()、乘(*)、除(/)和取模(%)。,32,2赋值运算符,Transact-SQL中只有一个赋值运算符,即等号(=)。赋值运算符使我们能够将数据值指派给特定的对象。另外,还可以使用赋值运算符在列标题和为列定义值的表达式之间建立关系。,33,3位运算符,位运算符使我们能够在整型数据或者二进制数据(image数据类型除外)之间执行位操作。,表1位运算符,34,4比较运算符,比较运算符用于比较两个表达式的大小或是否相同,其比较的结果是布尔值,即TRUE(表示表达式的结果为真)、FALSE(表示表达式的结果为假)以及UNKNOWN。除了text、ntext或image数据类型的表达式外,比较运算符可以用于所有的表达式。,35,5逻辑运算符,逻辑运算符可以把多个逻辑表达式连接起来。逻辑运算符包括AND、OR和NOT等运算符。逻辑运算符和比较运算符一样,返回带有TRUE或FALSE值的布尔数据类型。,36,6字符串串联运算符,字符串串联运算符允许通过加号(+)进行字符串串联,这个加号即被称为字符串串联运算符。例如对于语句SELECTabc+def,其结果为abcdef。,37,运算符的优先级从高到低排列,括号:();乘、除、求模运算符:*、/、%;加减运算符:+、-;比较运算符:=、=、!=、!、!;位运算符:、&、|;逻辑运算符:NOT;逻辑运算符:AND;逻辑运算符:OR。,38,函数,在Transact-SQL语言中,函数被用来执行一些特殊的运算以支持SQLServer的标准命令。Transact-SQL编程语言提供了三种函数:行集函数:行集函数可以在Transact-SQL语句中当作表引用。聚合函数:聚合函数用于对一组值执行计算并返回一个单一的值。标量函数:标量函数用于对传递给它的一个或者多个参数值进行处理和计算,并返回一个单一的值。,39,标量函数的分类,配置函数:返回当前的配置信息游标函数:返回有关游标的信息日期和时间函数:用于对日期和时间类型的输入值进行操作,返回一个字符串、数字或日期和时间值数学函数:用于对作为函数参数提供的输入值执行操作,返回一个数字值元数据函数:返回有关数据库和数据库对象的信息安全函数:返回有关用户和角色的信息字符串函数:对字符串输入值执行操作,并返回一个字符串或数字值系统函数:执行系统操作系统统计函数:返回系统的统计信息文本和图像函数:对于文本或图像输入值或列执行操作,返回有关这些值的信息。,40,系统函数,系统函数用于返回有关SQLServer系统、用户、数据库和数据库对象的信息。系统函数可以让用户在得到信息后,使用条件语句,根据返回的信息进行不同的操作。与其它函数一样,可以在SELECT语句的SELECT和WHERE子句以及表达式中使用系统函数。,41,例:返回Northwind数据库的Employees表中的首列的名称。USENorthwindSELECTCOL_NAME(OBJECT_ID(Employees),1)运行结果为:EmployeeID其中:object_id:返回对象的id,42,日期和时间函数,日期和时间函数用于对日期和时间数据进行各种不同的处理和运算,并返回一个字符串、数字值或日期和时间值。表1列出了日期类型的名称、缩写形式以及可接受的值。,43,表1日期和时间函数的类型,44,例:从getdate函数返回的日期中提取月份数SELECTDATEPART(month,GETDATE()ASMonthNumber运行结果为:MonthNumber-9,45,例:从日期03/12/1998中返回月份、天数和年份数SELECTMONTH(03/12/1998),DAY(03/12/1998),YEAR(03/12/1998)运行结果为:-3121998,46,字符串函数,字符串函数可以对二进制数据、字符串和表达式执行不同的运算,大多数字符串函数只能用于char和varchar数据类型以及明确转换成char和varchar的数据类型,少数几个字符串函数也可以用于binary和varbinary数据类型。此外,某些字符串函数还能够处理text、ntext、image数据类型的数据。,47,字符串函数的分类:,基本字符串函数:UPPER、LOWER、SPACE、REPLICATE、STUFF、REVERSE、LTRIM、RTRIM。字符串查找函数:CHARINDEX、PATINDEX。长度和分析函数:DATALENGTH、SUBSTRING、RIGHT。转换函数:ASCH、CHAR、STR、SOUNDEX、DIFFERENCE。,48,数学函数,数学函数用于对数字表达式进行数学运算并返回运算结果。数学函数可以对SQLServer提供的数字数据(decimal、integer、float、real、money、smallmoney、smallint和tinyint)进行处理。,49,例:在同一表达式中使用CEILING()、FLOOR()、ROUND()函数。selectceiling(13.4),floor(13.4),round(13.4567,3)运行结果为:-141313.4570,50,转换函数,一般情况下,SQLServer会自动处理某些数据类型的转换。例如,如果比较char和datetime表达式、smallint和int表达式、或不同长度的char表达式,SQLServer可以将它们自动转换,这种转换被称为隐性转换。但是,无法由SQLServer自动转换的或者是SQLServer自动转换的结果不符合预期结果的,就需要使用转换函数做显示转换。转换函数有两个:CONVERT和CAST。,51,CONVERT和CAST函数,CAST(expressionASdata_type)data_type为SQLServer系统定义的数据类型,用户自定义的数据类型不能在此使用,52,CONVERT和CAST函数,CONVERT函数允许用户把表达式从一种数据类型转换成另一种数据类型,还允许把日期转换成不同的样式。其语法形式为:CONVERT(data_type(length),expression,style)其中:length用于指定数据的长度,默认值是30。style选项能以不同的格式显示日期和时间。style是将DATATIME和SMALLDATETIME数据转换为字符串时所选用的。由SQLServer系统提供的转换样式编号,不同的样式编号有不同的输出格式,53,例:USEpubsSELECTtitle,ytd_salesFROMtitlesWHERECAST(ytd_salesASchar(20)LIKE15%ANDtype=trad_cook运行结果为:Titleytd_sales-FiftyYearsinBuckinghamPalaceKitchens15096,54,用户自定义函数,除了使用系统提供的函数外,用户还可以根据需要自定义函数。用户自定义函数是SQLServer2000新增的数据库对象,是SQLServer的一大改进。用户自定义函数不能用于执行一系列改变数据库状态的操作,但它可以像系统函数一样在查询或存储过程等的程序段中使用,也可以像存储过程一样通过EXECUTE命令来执行。用户自定义函数中存储了一个Transact-SQL例程可以返回一定的值。在SQLServer2000中根据函数返回值形式的不同,将用户自定义函数分为三种类型:,55,标量型函数:.标量型函数返回一个确定类型的标量值。其返回值类型为除了TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP和TABLE类型外的其它数据类型。函数体语句定义在BEGIN-END语句内,其中包含了可以返回值的Transact-SQL命令。内嵌表值函数:内嵌表值函数以表的形式返回一个返回值,即它返回的是一个表。内嵌表值型函数没有由BEGIN-END语句括起来的函数体,其返回的表由一个位于RETURN子句中的SELECT命令段从数据库中筛选出来。内嵌表值型函数功能相当于一个参数化的视图。多语句表值型函数:多语句表值型函数可以看作标量型和内嵌表值型函数的结合体,它的返回值是一个表,但它和标量型函数一样有一个用BEGIN-END语句括起来的函数体。返回值的表中的数据是由函数体中的语句插入的。,56,创建标量型用户自定义函数,其语法如下:CREATEFUNCTIONowner_name.function_name(parameter_nameasscalar_parameter_data_type=default,.n)RETURNSscalar_return_data_typeWITH,.nASBEGINfunction_bodyRETURNscalar_expressionEND,57,:=ENCRYPTION|SCHEMABINDING各参数说明如下:owner_name:指定用户自定义函数的所有者function_name:指定用户自定义函数的名称。database_name.owner_name.function_name应是唯一的。parameter_name:定义一个或多个参数的名称,一个函数最多可以定义1024个参数,每个参数前用符号标明。参数的作用范围是整个函数,参数只能替代常量,不能替代表名、列名或其它数据库对象的名称,用户自定义函数不支持输出参数。,58,scalar_parameter_data_type:指定标量型参数的数据类型,可以为除TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP和TABLE类型外的其它数据类型。scalar_return_data_type:指定标量型返回值的数据类型,可以为除TEXT、NTEXT、IMAGE、CURSOR、TIMESTAMP和TABLE类型外的其它数据类型。scalar_expression:指定标量型用户自定义函数返回的标量值表达式。function_body:指定一系列的Transact-SQL语句,它们决定了函数的返回值,59,ENCRYPTION:加密选项。让SQLServer对系统表中有关CREATEFUNCTION的声明加密,以防止用户自定义函数作为SQLServer复制的一部分被发布。SCHEMABINDING:计划绑定选项。将用户自定义函数绑定到它所引用的数据库对象。如果指定了此选项,则函数所涉及的数据库对象从此将不能被删除或修改,除非函数被删除或去掉此选项。应注意的是要绑定的数据库对象必须与函数在同一数据库中。,60,例13-19创建工龄工资计算函数usepangugocreatefunctionWorkYearWage(hiredatedatetime,-hiredate表示雇佣日期todaydatetime,per_wagemoney)-today表示当前的日期per_wage表示每一年工龄应得的工资额returnsmoneyasbegindeclareWorkYearWagemoneysetWorkYearWage=(year(today)-year(hiredate)*per_wagereturn(WorkYearWage)end-结束函数定义-创建函数go,61,-调用函数selectpangu.dbo.workyearwage(1991-7-1,getdate(),15)aswork_year_wage运行结果如下work_year_wage135.0000(1row(s)affected)上例的创建语句也可以写成如下形式createfunctionWorkYearWage(hiredatedatetime,todaydatetime,per_wagemoney)returnsmoneyasbeginreturn(year(today)-year(hiredate)*per_wage)end,62,创建内嵌表值用户自定义函数,其语法如下:CREATEFUNCTIONowner_name.function_name(parameter_nameasscalar_parameter_data_type=default,.n)RETURNSTABLEWITH,.nASRETURN(select-stmt)各参数说明如下TABLE:指定返回值为一个表select-stmt:单个SELECT语句,确定返回的表的数据,其余参数与标量型用户自定义函数相同。,63,例:创建返回所有订购某类产品的公司信息函数usesamplegocreatefunctionorderfirms(productidvarchar(30)returnstableasreturn(select*fromproductspwherep.p_id=productid)Go,64,创建多语句表值用户自定义函数,其语法如下:CREATEFUNCTIONowner_name.function_name(parameter_namescalaras_parameter_data_type=default,.n)RETURNSreturn_variableTABLEWITH,.nASBEGINfunction_bodyRETURNEND:=(column_definition|table_constraint,.n)各参数说明如下:return_variable:一个TABLE类型的变量,用于存储和累积返回的表中的数据行。其余参数与标量型用户自定义函数相同。,65,用企业管理器创建用户自定义函数,用EnterpriseManager创建用户自定义函数的方法是:在EnterpriseManager中选择要创建用户自定义函数的数据库,在数据库对象UserDefinedFunctions上单击右键,从开始菜单中选择NewUserDefinedFunction选项,就会出现定义用户自定义函数属性对话框,可以在其中指定要定义的函数的名称,并编辑函数的脚本,单击OK按钮则添加用户自定义函数对象到数据库中。,66,修改和删除用户自定义函数,在EnterpriseManager中选择要进行改动的用户自定义函数,单击右键,从快捷菜单中选择属性选项,则会出现修改用户自定义函数结构对话框。可以修改用户自定义函数的函数体、参数等,从快捷菜单中选择删除选项,则可删除用户自定义函数。用ALTERFUNCTION命令也可以修改用户自定义函数,此命令的语法与CREATEFUNCTION相同,因此使用ALTERFUNCTION命令其实相当于重建了一个同名的函数,用起来不大方便。另外可以用DROPFUNCTION命令删除用户自定义函数其语法如下:DROPFUNCTIONowner_name.function_name,.n例:删除用户自定义函数chiefinfodropfunctionchiefinfo,67,流程控制语句,流程控制语句是指那些用来控制程序执行和流程分支的命令,在SQLServer2000中,流程控制语句主要用来控制SQL语句、语句块或者存储过程的执行流程。,68,BEGINEND语句,BEGINEND语句能够将多个Transact-SQL语句组合成一个语句块,并将它们视为一个单元处理。在条件语句和循环等控制流程语句中,当符合特定条件便要执行两个或者多个语句时,就需要使用BEGINEND语句,其语法形式为:BEGINsql_statement|statement_blockEND,69,例如:,UsesampleGoDeclaremessagevarchar(200)Ifexist(select*from员工数据表where所属部门办公室)BeginSetmessage=“下列人员在办公室工作:”PrintmessageSelect员工姓名from员工数据库Where所属部门“办公室”EndElsebeginsetmessage=“没有人在办公室工作”PrintmessageEndgo,70,IFELSE语句,IFELSE语句是条件判断语句,其中,ELSE子句是可选的,最简单的IF语句没有ELSE子句部分。IFELSE语句用来判断当某一条件成立时执行某段程序,条件不成立时执行另一段程序。SQLServer允许嵌套使用IFELSE语句,而且嵌套层数没有限制。,71,IFELSE语句的语法形式,IFBoolean_expressionsql_statement|statement_blockELSEsql_statement|statement_block,72,IFEXISTS语句,If后面的布尔表达式可含有select语句,如果select语句返回一个值,它可用来与另一值进行比较,以得到布尔表达式。如果Select语句返回不止一个值,可使用IfExists。语法如下:Ifexists(selectstatement)sql_statement|statement_blockELSEBolean_expressionsql_statement|statement_block,73,例如:查询标识号为9933的出版商出版的任何书的信息Ifexists(select*fromtitleswherepub_id=9933beginprint“包含如下图书:”select*fromtitleswherepub_id=9933endelseprint“无”,74,注意:一定不要把ifexists和聚合函数一起使用,因为聚合函数总是返回数据,即使数据是0。例如:ifexists(selectcount(*)fromtitleswherepub_id=9933),75,WHILE语句,WHILE语句用于设置重复执行SQL语句或语句块的条件。只要指定的条件为真,就重复执行语句。其中,CONTINUE语句可以使程序跳过CONTINUE语句后面的语句,回到WHILE循环的第一行命令。BREAK语句则使程序完全跳出循环,结束WHILE语句的执行。,76,WHILE语句,Break语句将在某些情况发生时,立即无条件地退出最内层while循环。语法为:WHILE逻辑表达式begin.Breakend,77,While语句,Continue语句在某些情况发生时,控制程序跳出本次循环,重新开始下一次while循环。其语法为:While逻辑表达式Begin.Continue.End注意:如果select语句用作while语句的条件,那么,select语句必须包含在英文括号中。,78,例:declarexint,yint,cintselectx=1,y=1whilex3beginprintx-打印变量x的值whiley3beginselectc=100*x+yprintc-打印变量c的值selecty=y+1endselectx=x+1selecty=1end,79,CASE表达式,CASE表达式可以计算多个条件式,并将其中一个符合条件的结果表达式返回。CASE表达式的语法为:CASE字段名或变量名WHEN逻辑表达式1THEN结果表达式1WHEN逻辑表达式1THEN结果表达式1WHEN逻辑表达式1THEN结果表达式1ELSE结果表达式END,80,例:调整员工工资,工作级别为1的上调8%,工作级别为2的上调7%,工作级别为3的上调6%,其它上调5%。use工资库updateemployeesete_wage=casewhenjob_level=1thene_wage*1.08whenjob_level=2thene_wage*1.07whenjob_level=3thene_wage*1.06elsee_wage*1.05end,81,RETURN语句,RETURN语句用于无条件地终止一个查询、存储过程或者批处理,此时位于RETURN语句之后的程序将不会被执行。RETURN语句的语法形式为:RETURN整数表达式通常,存储过程使用返回代码表示存储过程执行的成功或失败。无错误,则返回0,否则,返回非零值。,82,WAITFOR语句,WAITFOR语句用于暂时停止执行SQL语句、语句块或者存储过程等,直到所设定的时间已过或者所设定的时间已到才继续执行。WAITFOR语句的语法形式为:WAITFORDELAY时间间隔其中,时间间隔指定执行waitfor语句之前需要等待的事件,最多为24小时。或者waitfortime时间值其中,时间值指定waitfor语句将要执行的时间,83,UsesampleGo-指定在执行select语句之前等待二秒Waitfordelay00:00:02-执行查询Select姓名,性别from员工数据表Where所属部门项目部,84,GOTO语句,GOTO语句可以使程序直接跳到指定的标有标识符的位置处继续执行,而位于GOTO语句和标识符之间的程序将不会被执行。GOTO语句和标识符可以用在语句块、批处理和存储过程中,标识符可以为数字与字符的组合,但必须以“:”结尾。GOTOlabellabel:,85,GOTO语句,例:利用GOTO语句求出从1加到5的总和。declaresumint,countintselectsum=0,count=1label_1:selectsum=sum+countselectcount=count+1ifcount=5gotolabel_1selectcount,sum,86,PRINT语句,语法格式为:PrintanyASCIItext|local_varible|global_variable注意:可输出的仅仅是ASCII字符串(字符串常数)或字符类型的变量若要输出更复杂的内容,须将字符串存入字符变量,然后输出该变量。,87,例:UsepubsDeclaremsgvarchar(50),numWAtinyintSelectnumWA=count(*)fromstoreswherestate=“WA”Selectmsg=Thereare+Convert(varchar(3),numWA)+storesinwashington.Printmsg,88,游标的引入,游标的优点和种类在数据库开发过程中,当你检索的数据只是一条记录时,你所编写的事务语句代码往往使用SELECT、INSERT语句,但是我们常常会遇到这样情况:即从某一结果集中逐一地读取一条记录,那么如何解决这种问题呢?游标为我们提供了一种较好的解决方案,89,声明游标,每一个游标必须有四个组成部分。这四个关键部分必须符合下面的顺序1.DECLARE游标2.OPEN游标3.从一个游标中FETCH信息4.CLOSE或DEALLOCATE游标通常我们使用DECLARE来声明一个游标。,90,声明游标,声明一个游标主要包括以下主要内容游标名字数据来源表和列选取条件属性仅读或可修改,91,其语法格式如下DECLARE游标名称INSENSITIVECURSORlocal|globalforward_only|scrollread_onlyFOR选择语句FORUPDATEOF字段名称1,字段名称2,其中:local|global指定该游标的作用域是局部的还是全局的。如果把forward_only选择为forward_only,则游标只能从第一行滚动到最后一行。,92,.SCROLL:表明所有的提取操作,如FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE都可用。如果不使用该保留字那么只能进行NEXT提取操作。选择语句:是定义结果集的SELECT语句,应该注意的是在游标中不能使用COMPUTE、COMPUTEBYFORBROWSEINTO语句READONLY:表明不允许游标内的数据被更新。UPDATEOF字段名1,n:定义在游标中可被修改的列。,93,下面给出声明游标的三个例子例1:标准游标declarecur_authorscursorforselectau_id,au_lname,au_fname,phone,address,city,state,contractfromauthors例2:只读游标declarecur_authorscursorforselectau_lname,au_fname,phone,address,city,statefromauthorsforreadonly,94,例:更新游标declarecur_authorscursorforselectau_lname,au_fnamefromauthorsforupdate,95,打开游标,游标在声明以后,如果要从游标中读取数据,必须打开游标。打开一个游标使用OPEN命令,其语法规则为OPEN游标名称注意:在打开游标时,如果游标声明语句中使用了INSENSITIVE保留字,则OPEN产生一个临时表来存放结果集。如果在结果集中任何一行数据的大小超过SQLSERVER定义的最大行尺寸时,OPEN命令将失败INSENSITIVE:表明SQLSERVER会将游标定义所选取出来的数据记录存放在一临时表内,(建立在tempdb数据库下)对该游标的读取操作皆由临时表来应答。因此,对基本表的修改并不影响游标提取的数据,即游标不会随着基本表内容的改变而改变,同时也无法通过游标来更新基本表。如果不使用该保留字,那么对基本表的更新、删除都会反映到游标中。,96,读取游标中的数据fetch,当游标被成功打开以后就可以从游标中逐行地读取数据以进行相关处理。从游标中读取数据主要使用FETCH命令,其语法规则为:FETCHNEXT|PRIOR|FIRST|LAST|ABSOLUTEn|nvar|RELATIVEn|nvarFROMcursor_nameINTOvariable_name1,variable_name2.,97,各参数含义说明如下:NEXT:返回结果集中当前行的下一行,并增加当前行数为返回行行数如果FETCHNEXT是第一次读取游标中数据则返回结果集中的是第一行而不是第二行PRIOR:返回结果集中当前行的前一行并减少当前行数为返回行行数。如果FETCHPRIOR是第一次读取游标中数据则无数据记录返回并把游标位置设为第一行FIRST:返回游标中第一行LAST:返回游标中的最后一行,98,ABSOLUTEn|nvar:如果n或nvar为正数,则表示从游标中返回的数据行数。如果n或nvar为负数,则返回游标内从最后一行数据算起的第n或nvar行数据。若n或nvar超过游标的数据子集范畴,则FETCH_STATUS返回-1。在该情况下,如果n或nvar为负数,则执行FETCHNEXT命令会得到第一行数据;如果n或nvar为正值,执行FETCHPRIOR命令则会得到最后一行数据。n或nvar可以是一固定值,也可以是一smallint,tinyint或int类型的变量。,99,RELATIVEn|nvar:若n或nvar为正数,则读取游标当前位置起向后的第n或nvar行数据。如果n或nvar为负数,则读取游标当前位置起向前的第n或nvar行数据。若n或nvar超过游标的数据子集范畴,则FETCH_STARS返回-1。在该情况下,如果n或nvar为负数,则执行FETCHNEXT命令则会得到第一行数据;如果n或nvar为正值,执行FETCHPRIOR命令则会得到最后一行数据。n或nvar可以是一固定值也可以是一smallint,tinyint或int类型的变量,100,INTOvariable_name,.n:允许将使用FETCH命令读取的数据存放在多个变量中;在变量行中的每个变量必须与游标结果集中相应的列相对应,每一变量的数据类型也要与游标中数据列的数据类型相匹配。,101,检查游标状态,FETCH_STATUS:全局变量,返回上次执行FETCH命令的状态。在每次用FETCH从游标中读取数据时,都应检查该变量以确定上次FETCH操作是否成功,来决定如何进行下一步处理。FETCH_STATUS变量有三个不同的返回值。0:表示成功取出了一行。1:表示未取到数据,因为所要求游标位置超出了结果集2:表示返回的行已经不再是结果集的一个成员。这种情况只有在游标不是insensitive的情况下出现,即其它进程已删除了行或改变了游标打开的关键值,从而使该行不再使游标集的结果成员之一了。,102,编辑当前游标行,通常情况下,我们用游标来从基础表中检索数据,以实现对数据的行处理。但在某些情况下,我们也常要修改游标中的数据,即进行定位更新或删除游标所包含的数据。所以必须执行另外的更新或删除命令,并在WHERE子句中重新给定条件才能修改到该行数据。但是如果在声明游标时使用了FORUPDATE语句,那么就可以在UPDATE或DELETE命令中以WHERECURRENTOF关键字直接修改或删除当前游标中所存储的数据,而不必使用WHERE子句重新给出指定条件。当改变游标中数据时,这种变化会自动地影响到游标的基础表。但是如果在声明游标时选择了INSENSITIVE选项时,该游标中的数据不能被修改。,103,进行定位修改或删除游标中数据的语法规则为:UPDATEtable_nameSETcolumn_name1=expression1|NULL(select_statement),column_name2=expression2|NULL(select_statement)WHERECURRENTOFcursor_nameDELETEFROMtable_nameWHERECURRENTOFcursor_name其中:table_name
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汉字真有趣课件状元成才路
- 审计人员工作总结(集锦15篇)
- 四川省凉山州2024-2025学年高一上学期期末考试物理试卷(含解析)
- 湖北省荆州市荆州中学2026届高三上学期8月月考语文试卷(含答案)
- 3ds Max室内设计效果图制作知到智慧树答案
- 《企业出纳实务》知到智慧树答案
- “趣”说产品设计(山东联盟)知到智慧树答案
- 2025购销个人物品合同协议书
- 汉字“不”字的起源课件
- 水运物流知识培训课件
- 道路建设三级安全教育培训
- 病历的书写规范讲课幻灯课件
- 征兵业务培训
- 心功能不全病人的护理查房
- NCCN成人癌痛指南
- 地理与生活密切相关
- 望闻问切中医四诊
- 订单交期管理制度流程
- 动画制作员职业技能大赛考试题库(浓缩500题)
- 动画制作员职业技能竞赛理论考试题库(含答案)
- 妊娠合并脓毒血症护理查房
评论
0/150
提交评论