mysql檢索操作返回一組成為結果集的行。使用簡單的select語句,例如,沒有辦法得到第一行、下一行或前10行,也不存在每次一行的處理所有行的簡單辦法。有時,需要再檢索出來的行中前進或後退一行或多行。這就是使用游標的原因。
mysql游標只能用於儲存過程(和函式)。
建立游標
delimiter //
create procedure processorders()
begin
declare ordernumbders cursor
forselect ordernum from orders;
end//
delimiter ;
這個儲存過程並沒有做很多事情,declare語句用來定義和命名游標,這裡為(二聲)ordernumbers。儲存過程處理完成後,游標就消失,因為它只能用於儲存過程(或函式)。
開啟和關閉游標
開啟之前定義的游標:
open ordernumbers;
在處理open語句時,執行查詢,儲存檢索除的資料以供瀏覽和滾動。
游標處理完成後,應當使用如下語句關閉游標:
close ordernumbers;
close釋放游標使用的所有內部記憶體和資源,因此在每個游標不再需要時都應該關閉。但是,當再次需要使用該游標的時候,無需重新定義,只需要使用open語句就可以重新開啟游標。
隱含關閉:如果你不明確關閉游標,mysql將會在到達end語句時自動關閉它。
使用游標資料
在乙個游標被開啟後,可以使用fetche語句分別訪問它的每一行。fetch指定檢索什麼資料(所需的列),檢索出來的資料儲存在什麼地方。它還可以向前移動游標中的內部指標,使嚇一跳fetch語句檢索下一行(不重複讀取同一行)。
mysql> create procedure processorders()
-> begin
-> declare o int;
-> declare t decimal(8,2);
-> declare down boolean default 0;
-> declare ordernumbers cursor
-> for
-> select order_num from orders;
-> declare continue handler for sqlstate "02000" set down=1;
-> create table if not exists ordertotals(order_num int,total decimal(8,2));
-> open ordernumbers;
-> repeat
-> fetch ordernumbers into o;
-> call ordertotal(o,1,t);
-> insert into ordertotals(order_num,total) values (o,t);
-> until down end repeat;
-> close ordernumbers;
-> end//
mysql> select * from ordertotals//
+-----------+---------+
| order_num | total |
+-----------+---------+
| 20005 | 158.86 |
| 20009 | 40.78 |
| 20006 | 58.30 |
| 20007 | 1060.00 |
| 20008 | 132.50 |
+-----------+---------+
這裡面需要用到之前儲存過程那個章節中講到的ordertotal()函式。 MYSQL使用游標
一 使用游標 一 宣告游標。delare cursor name cursor for select statement 解釋 cursor name是游標的名字 select statement表示select語句。因為游標需要遍歷結果集的每一行,增加了伺服器的負擔,導致游標的效率並不高效,如果使...
mysql中使用游標
sql view plain copy set max sp recursion depth 100 下面是mysql遞迴呼叫的源 sql view plain copy dropdelimiter createin uidvarchar 225 in ncountint begin declare...
使用游標 引數游標
參游標是指帶有引數的游標。在定義了引數游標之後,當使用不同引數值多次開啟游標時,可以生成不同的結果集。定義引數游標的語法如下 cursor cursor name parameter name datetype is select statement 注意,當定義引數游標時,游標引數只能指定資料型別...