【问题标题】:Why we need SQL's cursor?为什么我们需要 SQL 的游标?
【发布时间】:2017-03-06 22:47:22
【问题描述】:

图片有两个表:

Table_1:
id | name | phone
---| ---- | ----
1  | aaaa | 1111
2  | bbbb | 2222
3  | cccc | 3333
...| ...  | ...

Table_2 who is empty now:
id | name | phone
---| ---- | ----

如果你想从table_1中选择一些行并将它们插入到table_2中,我们可以这样做(第一种方式):

insert into table_2
  select * from table_1 where name='aaaa';

简单易行!只有一行代码,但是cursor我们需要几行代码(第二种方式使用MySQL的语法):

DECLARE done INT DEFAULT 0;  
DECLARE id int(3);  
DECLARE name char(11);  
DECLARE phone char(11);  
DECLARE mycur CURSOR FOR SELECT * FROM Table_1 where name='aaaa';  
DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;  

OPEN mycur;  

REPEAT  
FETCH mycur INTO id,name,phone;  
IF NOT done THEN  
  INSERT INTO Table_2 VALUES (id,name,phone);  
END IF;    
UNTIL done END REPEAT;

CLOSE mycur;  

我的意思是,在普通的producer 中,我们可以只使用第一种方法来处理没有游标的结果集吗? 我们什么时候真的需要一个游标??

【问题讨论】:

  • 当您尝试做的事情变得如此复杂以至于您举手并愿意说“是的,我不在乎它是如何发生的,有多慢,甚至慢 1000 倍,完成任务”
  • @Drew 能否请您在答案中详细解释一下,也许是一些例子,谢谢~
  • 如果您遇到一些棘手的问题,并且在没有光标的情况下看不到解决办法,也许会更容易回答。这是 sql dev 早期的一种普遍感觉,在这种情况下,思维倾向于程序性思维、我的方式、我的 for 循环与集合和关系以及 sql 引擎的快速工作方式。所以 sql 构建在一个拐杖(游标)中。随着您在旅途中继续前进,您将找到方法来执行您的任务,这是引擎优化的目标。光标非常慢。
  • Here 是我使用游标所做的自我回答。我不怀疑没有他们也能做到。但我只是想把这个答案拿出来,让人们在改变它时理解它。因此,对于更有条理的排序和呈现特性,可能是使用游标的一个原因。喜欢漂亮的印刷品。
  • MySQL 和 Oracle 是两个完全不同的 DBMS,具有不同的语法和功能。您的问题不可能同时与两者有关。请不要随意添加标签,因为它们具有熟悉或相似的名称。这里的标签具有意义和相关性。如果您不是绝对肯定标签适用,请阅读它的描述。如果您仍然不积极,请不要使用它;如果需要,这里有人会为您添加。

标签: mysql sql database


【解决方案1】:

在不能使用 SQL 语句的情况下需要游标,在大多数情况下用于数据操作以外的操作。例如-

  • 查看表列表并对每个表进行操作,例如收集统计信息/添加/删除分区。
  • 查看客户列表并为每个客户发送邮件/生成发票

附言

SQL 语句不能(有效)操作数据并且需要游标的情况非常、非常、非常罕见,尤其是当数据库支持分析功能时。

【讨论】:

    猜你喜欢
    • 2019-06-09
    • 2014-06-18
    • 2017-02-26
    • 2011-04-03
    • 2017-07-27
    • 2020-09-21
    • 2020-03-09
    • 2018-12-24
    • 2012-04-08
    相关资源
    最近更新 更多