MYSQL编程:声明游标
正如前文所提到的,MySQL易学、易部署、易管理和易维护。每个游标必需有四个构成部分这四个关头部分必需切合上面的按次;1.DECLARE游标
2.OPEN游标
3.从一个游标中FETCH信息
4.CLOSE或DEALLOCATE游标
一般我们利用DECLARE来声明一个游标声明一个游标次要包含以下次要内容:
[*]游标名字
[*]数据来历(表和列)
[*]拔取前提
[*]属性(仅读或可修正)
其语法格局以下:
DECLAREcursor_nameCURSOR
FORselect_statement
]}]
个中:
[*]cursor_name
指游标的名字。
[*]INSENSITIVE
标明MSSQLSERVER会将游标界说所拔取出来的数据纪录寄存在一一时表内(创建在tempdb数据库下)。对该游标的读取操纵皆由一时表来应对。因而,对基础表的修正其实不影响游标提取的数据,即游标不会跟着基础表内容的改动而改动,同时也没法经由过程
游标来更新基础表。假如不利用该保存字,那末对基础表的更新、删除城市反应到游标中。
别的应当指出,当碰到以下情形产生时,游标将主动设定INSENSITIVE选项。
在SELECT语句中利用DISTINCT、GROUPBY、HAVINGUNION语句;
利用OUTERJOIN;
所拔取的恣意表没有索引;
将实数值看成拔取的列。
[*]SCROLL
标明一切的提取操纵(如FIRST、LAST、PRIOR、NEXT、RELATIVE、ABSOLUTE)都可用。假如不利用该保存字,那末只能举行NEXT提取操纵。因而可知,SCROLL极年夜地增添了提取数据的天真性,能够随便读取了局会合的任一行数据纪录,而不用封闭再
重开游标。
[*]select_statement
是界说了局集的SELECT语句。应当注重的是,在游标中不克不及利用COMPUTE、COMPU-TEBY、FORBROWSE、INTO语句。
[*]READONLY
标明不同意伪昴诘氖荼桓戮」茉谌笔∽刺掠伪晔窃市砀碌摹6以UPDATE或DELETE语句的WHERECURRENTOF子句中,不同意对该游标举行援用。
[*]UPDATE]
界说在游标中可被修正的列,假如不指出要更新的列,那末一切的列都将被更新。当游标被乐成创立后,游标名成为该游标的唯一标识,假如在今后的存储历程、触发器或Transact_SQL剧本中利用游标,必需指定该游标的名字。
下面先容的是SQL_92的游口号律例则。上面先容MSSQLSERVER供应的扩大了的游标声明语法,经由过程增添别的的保存字,使游标的功效进一步失掉了加强其语律例则为;
[*]LOCAL
界说游标的感化域仅限在其地点的存储历程、触发器或批处置中。当创建游标的存储历程实行停止后,游标会被主动开释。因而,我们常在存储过程当中利用OUTPUT保存字,将游标传送给该存储历程的挪用者,如许在存储历程实行停止后,能够援用该游标变量,在该种情形下,直到援用该游标的最初一个就是被开释时,游标才会主动开释。
[*]GLOBAL
界说游标的感化域是全部会话层会话层指用户的毗连工夫它包含从用户登录到SQLSERVER到离开数据库的整段工夫。选择GLOBAL标明在全部会话层的任何存储历程、触发器或批处置中都可使用该游标,只要当用户离开数据库、时该游标才会被主动开释。
注重:假如既未利用GLOBAL也未利用LOCAL,那末SQLSERVER将利用defaultlocalcursor数据库选项,为了与以彰的版本歉容,该选项常设置为FALSE。
[*]FORWARD_ONLY
选项指明在从游标中提取数据纪录时,只能依照从第一行到最初一行的按次,此时只能选用FETCHNEXT操纵。除非利用STATIC,KEYSET和DYNAMIC关头字,不然假如未指明是利用FORWARD_ONLY仍是利用SCROLL,那末FORWARD_ONLY将成为缺省选项,由于若利用STATICKEYSET和DYNAMIC关头字,则酿成了SCROLL游标。别的假如利用了FORWARD_ONLY,便不克不及利用FAST_FORWARD。
[*]STATIC
选项的寄义与INSENSITIVE选项一样,MSSQLSERVER会将游标界说所拔取出来的数据纪录寄存在一一时表内(创建在tempdb数据库下)。对该游标的读取操纵皆由一时表来应对。因而对基础表的修正其实不影响游标中的数据,即游标不会跟着基础表内容的
改动而改动,同时也没法经由过程游标来更新基础表。
[*]KEYSET
指出当游标被翻开时,游标中列的按次是流动的,而且MSSQLSERVER会在tempdb内创建一个表,该表即为KEYSETKEYSET的键值可唯一辨认游标中的某行数据。当游标具有者或别的用户对基础表中的非键值数据举行修正时,这类变更可以反应到游标中,以是游标用户或一切者能够经由过程转动游标提限这些数据。
当别的用户增添一条新的切合所界说的游标局限的数据时,没法由此游标读到该数据。由于Transact-SQL服务器游标不撑持INSERT语句。
假如在游标中的某一行被删撤除,那末当经由过程游标来提取该删除行时,@@FETCH_STATUS的前往值为-2。@@FETCH_STATUS是用来判别读取游标是不是乐成的体系全局变量。
因为更新操纵包含两部分:删除原数据拔出新数据,以是假如读取原数据,@@FETCH_STATUS的前往值为-2;并且没法经由过程游标来读取新拔出的数据。可是假如利用了WHERECURRENTOF子句时,该新拔出行数据即是可见的。
注重:假如基本表未包括唯一的索引或主键,则一个KEYSET游标将复兴成STATIC游标。
[*]DYNAMIC
指明基本表的变更将反应到游标中,利用这个选项会最年夜水平上包管数据的分歧性。但是,与KEYSET和STATIC范例游标比拟较,此范例游标必要大批的游标资本。
[*]FAST_FORWARD
指明一个FORWARD_ONLY,READ_ONLY型游标。此选项已为实行举行了优化。假如SCROLL或FOR_UPDATE选项被界说,则FAST_FORWARD选项不克不及被界说。
[*]SCROLL_LOCKS
指明锁被安排在游标了局集所利用的数据受骗。数据被读进游标中时,就会呈现锁。这个选项确保对一个游标举行的更新和删除操纵总能被乐成实行。假如FAST_FORWARD选项被界说,则不克不及选择该选项。别的,因为数据被游标锁定,以是当思索到数据并发处置时,应制止利用该选项。
[*]OPTIMISTIC
指明在数据被读进游标后,假如游标中某行数据已产生变更,那末对游标数据举行更新或删除大概会招致失利。假如利用了FAST_FORWARD选项,则不克不及利用该选项。
[*]TYPE_WARNING
指明若游标范例被修正成与用户界说的范例分歧时,将发送一个告诫信息给客户端。
注重:不成以将SQL_92的游口号律例则与MSSQLSERVER的游标扩大用法夹杂在一同利用。
上面我们将总结一下声明游标时应注重的一些成绩。
假如在CURSOR前利用了SCROLL或INSENSITIVE保存字,则不克不及在CURSOR和FORselect_statement之间利用任何的保存字。反之同理。
假如用DECLARECURSOR声明游标时,没有选择READ_ONLY、OPTIMISTIC或SCROLL_LOCKS选项时,游标的缺省情形为:
假如SELECT语句不撑持更新,则游标为READ_ONLY;
STATIC和FAST_FORWARD范例的游标缺省为READ_ONLY;
DYNAMIC和KEYSET游标缺省为OPTIMISTIC。
我们仅能在Transact-SQL语句中援用游标,而不克不及在数据库API函数中援用。
游标被声明今后,能够经由过程体系历程对其特征举行设置。
对那些有权限对视图、表或某些列实行SELECT语句的用户而言,它也具有利用游标的缺省权限。
你会发现实际上MySQL可以更少地占用资金,前者的每CPU许可费用一般从4000美元到25000美元不等,而MySQL企业版的支持和维护成本就更低了。 是要和操作系统进行Socket通讯的场景。否则建议慎重! 语句级快照和事务级快照终于为SQLServer的并发性能带来了突破。个人感觉语句级快照大家应该应用。事务级快照,如果是高并发系统还要慎用。如果一个用户总是被提示修改不成功要求重试时,会杀人的! 我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过! 学习SQL语言的话如果要学会去做网站就不是很难!但是要做数据库管理的话就有难度了! 至于淘汰的问题,只能说在你的项目周期之内,微软应该都不会倒闭。 然后最好有实践机会,能够把实践到的和实践结合起来,其实理论思考是个非常困扰和痛苦的事情 having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。 每天坚持做不一样的是,认真做笔录,定时复习。一个月你就可以有一定的收获。当然如果你想在sql方面有一定的造诣,你少不了需要看很多很多的书籍了。
页:
[1]