所以,我刚刚了解了CURSORS,但仍然没有完全掌握它们。游标和过程甚至函数有什么区别?
到目前为止,从各种示例(DECLARE CURSOR ... SELECT ... FROM ...)来看,它似乎最多是一个保存查询的变量。数据是实时的,还是声明游标时的快照?
即 我有一张表,其中一行一列,值为 2。 我确实 DECLARE CURSOR ... SELECT * FROM table1 然后我插入一个值为 3 的新行。
当我运行游标时,我会只获取声明游标之前的一行,还是两行?
谢谢
我建议对“基于集合”和“基于行”进行一些研究。 这篇文章做得不错。
大多数数据库系统都适合执行基于集合的操作。 因此,当您执行基于行的操作(例如使用游标)时,您经常会遇到性能问题。 根据我的经验,很多使用游标的 sql 都可以在没有游标的情况下重写。
在您询问的示例中,光标中只有一条记录。
另外,请记住存储过程可以使用游标。
我相信文档会回答您的一些问题。仔细阅读“不敏感”等不同选项,了解它们的含义。
此外,作为一般规则,使用游标是不受欢迎的。在走光标路线之前,您应该始终尝试找到“基于集合”的解决方案。关于这个主题也有很多争论和文档,而且很容易访问。
我的建议是忘记你学过游标语法。游标是最后的手段,只能由了解游标对性能有何影响以及为什么基于集合的替代方案在其特定情况下不起作用的专家使用。如果您了解集合操作,则在游标中完成的大多数操作都可以通过基于集合的方式轻松完成。本文将帮助您了解需要了解的内容,以便您很少需要编写游标:
光标以及如何避免它们 [1]
[1] 原页面已无法使用,但在archive.org上有一些版本,当前链接为2018年8月14日的文章。
光标: 做一些需要逐行完成并且简单查询不可能完成的事情 例如,如果您有一个临时表来存储类别的层次结构,则光标可用于填充它
过程或存储过程是其中可以包含sql语句(包括游标)的集合。当通过传递参数(如果有)执行时,它将执行其中的语句
函数或过程是执行某些任务的一组指令。 游标是一个可以存储查询结果集的数组。
存储过程是预编译的对象,并作为大量语句执行,而游标用于逐行执行。
例如:您可以像袋子一样使用游标(游标类似于指向这么多行中的一行的指针),并在需要结果时将从过程中运行的查询的所有结果放入其中,只需打开袋子即可逐行找出结果。