2016-10-25 74 views
0

图片有两个表:为什么我们需要SQL的游标?

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,可我们只是用它来处理结果集的第一种方式没有光标? 什么时候我们真的需要一个光标?

+1

使用游标时,无论你试图做什么变得如此复杂,你举起你的手,并愿意说:“是的,我不在乎它是如何发生的,多慢,甚至1000倍慢得多呃完成” – Drew

+0

@Drew您能否给我解释一下答案中的更多细节,或许是一些例子,谢谢〜 – KaKa

+0

也许如果你面对一些棘手的问题时会更容易回答,而且如果没有游标。这是在sql开发初期的一种常见感觉,其中思维是面向程序思维,我的方式,我的for循环与集合和关系以及sql引擎工作的快速方式。所以sql建立在一个拐杖(游标)。当你在旅途中继续前行时,你会找到方法来执行你的任务,这是引擎优化的目标。游标就像非常缓慢。 – Drew

回答

2

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

  • 查看表格列表并在每个表格上进行操作,例如,收集统计信息/添加/删除分区。
  • 去了客户的名单和他们中的每一个发送邮件/生成发票

附:

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