SQL-SERVER 声明游标
SQL-SERVER 声明游标【yóu biāo】🐸
每一个♉游标【yóu biāo】🐸必须有四个组【sì gè zǔ】成【chéng】🐸部分这【bù fèn zhè】四个关键部分😋必须符🐥合下面的顺序;
1.DECLARE 游标【yóu biāo】🐸
2.OPEN 游标【yóu biāo】🐸
3.从一个游标【gè yóu biāo】🐸中FETCH 信息【xìn xī】
4.CLOSE 或📌DEALLOCATE 游标【yóu biāo】🐸
通常我【tōng cháng wǒ】💡们使用DECLARE 来声明🌈一个游标【gè yóu biāo】🐸声明一个游标【gè yóu biāo】🐸主要包【zhǔ yào bāo】括以下主要内容:
- 游标名字
- 数据来源(表和列)
- 选取条件
- 属性🚷(仅读或【jǐn dú huò】可修改)
其语法⬆格式如【gé shì rú】下【xià】✍:
DECLARE cursor_name [INSENSITIVE] [SCROLL] CURSOR
FOR select_statement
[FOR {READ ONLY | UPDATE [OF column_name [,...n]]}]
其中: - cursor_name
指游标【zhǐ yóu biāo】🦍的名字。 - INSENSITIVE
表明MS SQL SERVER 会将游🐺标定义【biāo dìng yì】📠所选取♿出来的数据记【shù jù jì】录存放在一临【zài yī lín】🥔时【shí】表内(建立在tempdb 数据库下【xià】)。对该游标的读🐆取操作皆由临【jiē yóu lín】📄时表来【shí biǎo lái】应答📕。因此,对基本表【jī běn biǎo】🦉的修改并不影响游标【xiǎng yóu biāo】提取【tí qǔ】🤲的数据,即游标【jí yóu biāo】😃不会随🖍着基本表【jī běn biǎo】🦉内容的【nèi róng de】改变而【gǎi biàn ér】改变【gǎi biàn】,同时也【tóng shí yě】🐞无法通【wú fǎ tōng】过
游标来更新基本表【jī běn biǎo】🦉。如果不【rú guǒ bú】使用该🥝保留字,那么对基本表【jī běn biǎo】🦉的更新、删除都会反映到游标中【zhōng】📧。
另外应该指出【gāi zhǐ chū】,当遇到以下情【yǐ xià qíng】况发生时【shí】,游标将🎵自动设定🕔INSENSITIVE 选项。
在SELECT 语句【yǔ jù】😦中【zhōng】📧使用👿DISTINCT、 GROUP BY、 HAVING UNION 语句【yǔ jù】😦;
使用👿OUTER JOIN;
所选取♿的任意表没有⏭索引【suǒ yǐn】;
将实数值当作选取的列。 - SCROLL
表明所有的提🕜取操作【zuò】(如【rú】FIRST、 LAST、 PRIOR、 NEXT、 RELATIVE、 ABSOLUTE)都可用。如【rú】果不🖨使用该保留字,那么只🚣能进行【néng jìn háng】NEXT 提取操作【zuò】。由此可【yóu cǐ kě】见【jiàn】,SCROLL 极大地增加了🐿提取数据的灵【jù de líng】🐜活性🍔,可以随意读取结果集中的任一行数🍹据记录【jù jì lù】😭,而不必🌓关闭再
重开游【chóng kāi yóu】标【biāo】。 - select_statement
是定义结果集的🍳SELECT 语句。应该注【yīng gāi zhù】🎸意的是【yì de shì】🥇,在游标中不能【zhōng bú néng】使用COMPUTE、COMPU- TE BY、 FOR BROWSE、 INTO 语句。 - READ ONLY
表明不允许【bú yǔn xǔ】🖌游标内的【de】📅数据被🍢更新尽管在缺💜省状态下游标【xià yóu biāo】是允许【yǔn xǔ】🐐更新的【gèng xīn de】🍓。而且在UPDATE或DELETE 语句的【yǔ jù de】WHERE CURRENT OF 子句中,不允许【bú yǔn xǔ】🖌对该游标进行引用。 - UPDATE [OF column_name[,…n]]
定义在【dìng yì zài】游标中【yóu biāo zhōng】🧞可被修🕦改的列🏪,如果不指出要更新的【gèng xīn de】⏸列,那么所【nà me suǒ】有的列【yǒu de liè】🐸都将被更新。当游标【biāo】😀被成功创建后,游标【biāo】✉名成为【míng chéng wéi】该游标【biāo】✉的惟一标【biāo】✉识【shí】,如果在以后的存储过🎃程【chéng】、触发器【chù fā qì】或📡Transact_SQL 脚本中【jiǎo běn zhōng】使用游标【biāo】✉,必须指🍴定该游标【biāo】✉的名字。
上面介👛绍🕙的是【de shì】SQL_92 的游标语法规【yǔ fǎ guī】🍐则【zé】。下面介绍🕙MS SQL SERVER 提供的😳扩展了【kuò zhǎn le】的游标声明语🌪法【fǎ】⛹,通过增【tōng guò zēng】加另外的保留字,使游标的功能【de gōng néng】进一步🐉得到了增强其语法规【yǔ fǎ guī】🍐则为【zé wéi】;
- LOCAL
定义游【dìng yì yóu】标的作用【yòng】域仅限在其🌐所在的【suǒ zài de】存储过【cún chǔ guò】🍆程、触发器【chù fā qì】或批处😼理中。当建立🎷游标的存储过【cún chǔ guò】🍆程执行🍾结束后【jié shù hòu】,游标会【yóu biāo huì】被自动释放【shì fàng】。因此,我们常在存储过【cún chǔ guò】🍆程中使【chéng zhōng shǐ】用【yòng】OUTPUT 保留字【bǎo liú zì】,将游标传递给该存储【gāi cún chǔ】过🍆程的调用【yòng】者,这样在【zhè yàng zài】📛存储过【cún chǔ guò】🍆程执行🍾结束后【jié shù hòu】,可以引【kě yǐ yǐn】💣用【yòng】该游📒标变量,在该种情况下📔,直到引🎻用【yòng】该游📒标的最【biāo de zuì】后一个🎐就是被🎙释放【shì fàng】时⛓,游标才会自动释放【shì fàng】。 - GLOBAL
定义游【dìng yì yóu】标【biāo】的作用域是整个会🎃话层会🔴话层指用户的连接时间它包【jiān tā bāo】括从用户登录到【dào】SQLSERVER 到【dào】脱离🌬数据库🤕的整段时间。选择😢GLOBAL 表明在整个会🎃话层的任何存【rèn hé cún】储过程、触发器【chù fā qì】或批处理中都🚉可以使【kě yǐ shǐ】用该游【yòng gāi yóu】🆕标【biāo】,只有当【zhī yǒu dāng】👒用户脱离数据库🤕、时该游【shí gāi yóu】🐅标【biāo】才会💱被自动【bèi zì dòng】释放【shì fàng】🥍。
注意【zhù yì】🕛:如果既🈹未使用【wèi shǐ yòng】GLOBAL也未使【yě wèi shǐ】🤺用LOCAL,那么SQL SERVER将使用🤙default local cursor数据库🤕选项,为了与以彰的版本歉容,该选项常设置【cháng shè zhì】🍋为FALSE。 - FORWARD_ONLY
选项😭指明在【zhǐ míng zài】从游标中提取【zhōng tí qǔ】数据记录时,只能按【zhī néng àn】照从第一行到最后一【zuì hòu yī】⛑行的顺序【xù】,此时只能选用【néng xuǎn yòng】📶FETCH NEXT 操作。除非使用🍴STATIC, KEYSET 和【hé】🎎DYNAMIC 关键字【guān jiàn zì】🙇,否则如【fǒu zé rú】果未指💝明是使用🍴FORWARD_ONLY 还是使用🍴SCROLL, 那么🎦FORWARD_ONLY 将成为缺省选🧥项😭,因为若🍊使用🍴STATIC KEYSET 和【hé】🎎DYNAMIC 关键字【guān jiàn zì】🙇,则变成【zé biàn chéng】🧞了【le】🥝SCROLL 游标。另外如果使用【guǒ shǐ yòng】🍴了【le】🥝FORWARD_ONLY, 便不能【biàn bú néng】使用🍴FAST_FORWARD。 - STATIC
选项的含义与【hán yì yǔ】INSENSITIVE 选项一样,MS SQL SERVER 会将游标定义所选取出来的【chū lái de】数据记【shù jù jì】录存放【lù cún fàng】在一临🔖时表内(建立在tempdb 数据库下🚭)。对该游【duì gāi yóu】🧛标的读取操作【qǔ cāo zuò】🐛皆由临时表来【shí biǎo lái】🤪应答🎾。因此对🗄基本表的修改并不影响游标【xiǎng yóu biāo】中的数【zhōng de shù】据,即游标【jí yóu biāo】📢不会随🌇着基本🆑表内容【biǎo nèi róng】的
改变而改变,同时也🥠无法通过游标来更新【lái gèng xīn】🙄基本表。 - KEYSET
指出当【zhǐ chū dāng】🎌游标【yóu biāo】😰被打开【bèi dǎ kāi】时【shí】📟,游标【yóu biāo】😰中列的【zhōng liè de】顺序是【shùn xù shì】固定的【gù dìng de】🍁,并且【bìng qiě】🦌MS SQL SERVER 会在【huì zài】🏽tempdb内建立🤓一个表,该表即为KEYSET KEYSET 的键【jiàn】值⚫可惟一识别游🙉标中的【biāo zhōng de】某行数据【jù】🌠。当游标【yóu biāo】😰拥有者或其它用户对📠基本表【jī běn biǎo】中【zhōng】的非键【jiàn】值数据【jù】🌠进行修【jìn háng xiū】改时【shí】📟,这种变化能够反映到游标【yóu biāo】😰中【zhōng】,所以游标【yóu biāo】😰用户或所有者可以通过滚🔘动游标【yóu biāo】😰提限这【tí xiàn zhè】些数据【xiē shù jù】🧢。
当其它用户增【yòng hù zēng】加一条【jiā yī tiáo】🕴新的符合所定🔉义的游【yì de yóu】🏗标范围【biāo fàn wéi】🥥的数据【jù】🌂时【shí】📟,无法由此游标【yóu biāo】😰读到该数据【jù】🌠。因为🐕Transact-SQL 服务器🔥游标不【yóu biāo bú】🌚支持INSERT 语句【yǔ jù】。
如果在游标【yóu biāo】😰中的某【zhōng de mǒu】一行被删除掉,那么当通过游【tōng guò yóu】标😰来提取【lái tí qǔ】该删🐸除行时【shí】💩,@@FETCH_STATUS 的返回值为-2。 @@FETCH_STATUS 是用来判断读取游标【yóu biāo】😰是否成功的系【gōng de xì】👂统全局【tǒng quán jú】变量🈸。
由于更新操作包括两【bāo kuò liǎng】🐌部分:删除原数据【jù】🌠插入新数据【jù】🌠,所以如果读取🤼原数据【jù】🌠,@@FETCH_STATUS 的返回值为-2; 而且无【ér qiě wú】🤤法通过游【tōng guò yóu】标😰来读取新🛎插入的数据【jù】🌂。但是如【dàn shì rú】果使用了WHERE CURRENT OF 子句时【shí】📟,该新插入行数😤据【jù】🌠便是可【biàn shì kě】见的。
注意:如果基础表未【chǔ biǎo wèi】包含惟【bāo hán wéi】一的索【yī de suǒ】引或主📂键【jiàn】,则一个【zé yī gè】🗓KEYSET游标【yóu biāo】将🎏回复成STATIC游标【yóu biāo】😰。 - DYNAMIC
指明基✋础表的变化将🈂反映到游标中🥚,使用这【shǐ yòng zhè】个选项会最大程度上【chéng dù shàng】🗨保证数据的一致性。然而🍹,与🆔KEYSET 和【hé】STATIC 类型游【lèi xíng yóu】标相比【biāo xiàng bǐ】较【jiào】📓,此类型【cǐ lèi xíng】游标需要大量的游标资源。 - FAST_FORWARD
指明一🚕个【gè】FORWARD_ONLY, READ_ONLY 型游标。此选项已为执🔗行进行【háng jìn háng】🔺了优化。如果【rú guǒ】💞SCROLL 或🕚FOR_UPDATE 选项被【xuǎn xiàng bèi】定义【dìng yì】,则FAST_FORWARD 选项不能被定义【dìng yì】。 - SCROLL_LOCKS
指明锁😜被放置【bèi fàng zhì】在游标结果集🛂所使用🍧的数据🔰上当【shàng dāng】🗳。数据被读入游标中时,就会出【jiù huì chū】🚊现锁【xiàn suǒ】。这个选项确保🚎对一个游标进【yóu biāo jìn】行的更【háng de gèng】新和删除操作总能被【zǒng néng bèi】成功执【chéng gōng zhí】行。如果FAST_FORWARD选项被🦊定义,则不能选择该💬选项。另外【lìng wài】,由于数【yóu yú shù】据被游标锁定【biāo suǒ dìng】🕔,所以当【suǒ yǐ dāng】👈考虑到数据并发处理时,应避免🍡使用该选项。 - OPTIMISTIC
指明在【zhǐ míng zài】数据被【shù jù bèi】读入游【dú rù yóu】标后【biāo hòu】🏨,如果游标中某🕉行数据🛩已发生⛹变化【biàn huà】🌟,那么对游标数据进行【jù jìn háng】更新或删除可能会导【néng huì dǎo】致失败。如果使用了FAST_FORWARD 选项🤗,则不能♏使用该选项🤗。 - TYPE_WARNING
指明若游标类型被修【xíng bèi xiū】改成与用户定🏹义的类型不同时🌄,将发送【jiāng fā sòng】一个警【yī gè jǐng】🕸告信息【gào xìn xī】📓给客户【gěi kè hù】端【duān】。
注意:不可以将SQL_92的游标【de yóu biāo】🔞语法规则与MS SQL SERVER的游标【de yóu biāo】🔞扩展用法混合⏬在一起🖌使用。
下面我们将总【men jiāng zǒng】结一下声明游标时【biāo shí】🥝应注意【yīng zhù yì】的一些问题。
如果【rú guǒ】在【zài】🎇CURSOR 前使用📀了【le】SCROLL 或INSENSITIVE 保留字,则不能在【zài】🤥CURSOR 和【hé】FOR select_statement 之间使😸用任何的保留字。反之同⏺理🚝。
如果【rú guǒ】用DECLARE CURSOR 声明游标时【biāo shí】🥝,没有选🔣择READ_ONLY、 OPTIMISTIC 或SCROLL_LOCKS 选项时,游标【biāo】的🍨缺省情【quē shěng qíng】🕒况为:
如果【rú guǒ】SELECT 语句不🥋支持更🈸新🗨,则游标【biāo】🛩为READ_ONLY;
STATIC 和【hé】FAST_FORWARD 类型的游标缺【yóu biāo quē】🚻省为【shěng wéi】READ_ONLY;
DYNAMIC 和【hé】KEYSET 游标缺【yóu biāo quē】🚻省为【shěng wéi】OPTIMISTIC。
我们仅🎆能在【zài】🤥Transact-SQL 语句中【yǔ jù zhōng】引用游标【biāo】🛩,而不能【ér bú néng】🎹在【zài】数据🏼库API 函数中引用。
游标【biāo】🛩被声明【bèi shēng míng】以后【yǐ hòu】😸,可以通过系统过程对其特性【qí tè xìng】进行设【jìn háng shè】📅置🍝。
对那些【duì nà xiē】有权限【yǒu quán xiàn】对视图、表或某【biǎo huò mǒu】些列执行SELECT 语句的用户而【yòng hù ér】言🛹,它也具有使用【yǒu shǐ yòng】游标【biāo】的🍨缺省权【quē shěng quán】限。
关键词:SQL-SERVER
阅读本文后您有什么感想? 已有 人给出评价!
- 0
- 0
- 0
- 0
- 0
- 0