【问题标题】:Cursors vs Procedures in SQLSQL 中的游标与过程
【发布时间】:2010-06-16 14:21:22
【问题描述】:

所以,我刚刚了解了 CURSORS,但还没有完全掌握它们。游标和过程甚至函数之间有什么区别?

到目前为止,从各种示例(DECLARE CURSOR ... SELECT ... FROM ...)看来,它最多是一个保存查询的变量。数据是实时的,还是声明游标时的快照?

即 我有一个表,其中一行和一列的值为 2。 我做 DECLARE CURSOR ... SELECT * FROM table1 然后我插入一个值为 3 的新行。

当我运行游标时,我是只获取游标声明前的一行,还是两行?

谢谢

【问题讨论】:

    标签: sql


    【解决方案1】:

    我建议对“基于集合”与“基于行”进行一些研究。 This article 做得不错。

    大多数数据库系统都适合执行基于集合的操作。因此,当您执行基于行的操作(如使用游标)时,您经常会看到性能问题。根据我的经验,很多使用游标的 sql 都可以在没有游标的情况下重写。

    在您询问光标的示例中,其中只有一条记录。

    另外,请记住,存储过程可以使用游标。

    【讨论】:

      【解决方案2】:

      我相信the documentation 会回答您的一些问题。通读“不敏感”等不同选项,了解它们的含义。

      此外,作为一般规则,不赞成使用游标。在走光标路线之前,您应该始终尝试找到“基于集合”的解决方案。也有很多关于这个主题的辩论和文档,很容易获得。

      【讨论】:

        【解决方案3】:

        我的建议是忘记你学过游标的语法。游标是不得已而为之的技术,只能由了解游标对性能的影响以及为什么基于集合的替代方案在他的特定情况下不起作用的专家使用。如果您了解集合操作,则在游标中完成的大多数事情都更容易以基于集合的方式完成。此链接将帮助您了解您需要了解的内容,以便您很少需要编写光标:

        http://wiki.lessthandot.com/index.php/Cursors_and_How_to_Avoid_Them

        【讨论】:

          【解决方案4】:

          光标: 做一些要逐行完成的事情,而简单的查询是不可能的 例如,如果你有一个临时表来存储类别的层次结构,游标可以用来填充它

          过程或存储过程是可以在其中包含 sql 语句(包括游标)集合的东西。通过传递参数(如果有)执行时,它将执行其中的语句

          【讨论】:

            【解决方案5】:

            函数或过程是执行某些任务的一组指令。 游标是一个可以存储查询结果集的数组。

            【讨论】:

              【解决方案6】:

              存储过程是预编译的对象并作为大量语句执行,而游标用于逐行执行。

              例如:您可以像袋子一样使用游标(游标类似于在众多行中指向单行的指针)并将查询运行的所有结果放在过程中,只要您需要结果,只需打开袋子,逐行找出结果。

              【讨论】:

                猜你喜欢
                • 2020-07-14
                • 1970-01-01
                • 1970-01-01
                • 2018-12-08
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-10-06
                相关资源
                最近更新 更多