2016-10-25 71 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語句(有效)操作,並且需要使用遊標,尤其是當數據庫支持分析函數時。