mysql cursor遊標的使用,執行個體

來源:互聯網
上載者:User

mysql被oracle收購後,從mysql-5.5開始,將InnoDB作為預設儲存引擎,是一次比較重大的突破。InnoDB作為支援事務的儲存引擎,擁有相關的RDBMS特性:包括ACID事務支援,資料完整性(外健),災難恢複能力等特性。

使用mysql做為資料庫的話,將來程式員肯定要寫很多,預存程序,function等。在寫些東東的時候,遊標肯定是少不了的。下面簡單簡介一下。
一,什麼是遊標(cursor)

個人覺得就是一個cursor,就是一個標識,用來標識資料取到什麼地方了。你也可以把它理解成數組中的下標。

二,遊標(cursor)的特性

1,唯讀,不能更新的。
2,不滾動的
3,不敏感的,不敏感意為伺服器可以活不可以複製它的結果表

遊標(cursor)必須在聲明處理常式之前被聲明,並且變數和條件必須在聲明遊標或處理常式之前被聲明。

三,使用遊標(cursor)

1.聲明遊標

DECLARE cursor_name CURSOR FOR select_statement
這個語句聲明一個遊標。也可以在子程式中定義多個遊標,但是一個塊中的每一個遊標必須有唯一的名字。聲明遊標後也是單條操作的,但是不能用SELECT語句不能有INTO子句。

2. 遊標OPEN語句

OPEN cursor_name
這個語句開啟先前聲明的遊標。

3. 遊標FETCH語句

FETCH cursor_name INTO var_name [, var_name] ...
這個語句用指定的開啟遊標讀取下一行(如果有下一行的話),並且前進遊標指標。

4. 遊標CLOSE語句

CLOSE cursor_name
這個語句關閉先前開啟的遊標。

四,應用舉例

1,測試表和資料

查看複製列印?
  1. mysql> show create table users\G;      //建立一個測試表  
  2. *************************** 1. row ***************************  
  3.  Table: users  
  4. Create Table: CREATE TABLE `users` (  
  5.  `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT,  
  6.  `user_name` varchar(60) NOT NULL DEFAULT '',  
  7.  `user_pass` varchar(64) NOT NULL DEFAULT '',  
  8.  PRIMARY KEY (`ID`)  
  9. ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8  
  10. 1 row in set (0.00 sec)  
  11.   
  12. mysql> select * from users;           //測試資料  
  13. +----+-----------+-----------+  
  14. | ID | user_name | user_pass |  
  15. +----+-----------+-----------+  
  16. |  1 | tank      | tank      |  
  17. |  2 | zhang     | zhang     |  
  18. |  3 | ying      | ying      |  
  19. |  4 | tank      | zhang     |  
  20. +----+-----------+-----------+  
  21. 4 rows in set (0.00 sec)  

2,測試預存程序

查看複製列印?
  1. mysql> delimiter |  
  2. mysql> create procedure test_cursor (in param int(10),out result varchar(90))  
  3.  -> begin  
  4.  ->     declare name varchar(20);  
  5.  ->     declare pass varchar(20);  
  6.  ->     declare done int;  
  7.  ->     declare cur_test CURSOR for select user_name,user_pass from test.users;  
  8.  ->     declare continue handler FOR SQLSTATE '02000' SET done = 1;  
  9.  ->     if param then  
  10.  ->         select concat_ws(',',user_name,user_pass) into result from test.users where id=param;  
  11.  ->     else  
  12.  ->         open cur_test;  
  13.  ->         repeat  
  14.  ->             fetch cur_test into name, pass;  
  15.  ->             select concat_ws(',',result,name,pass) into result;  
  16.  ->         until done end repeat;  
  17.  ->         close cur_test;  
  18.  ->     end if;  
  19.  -> end;|  
  20. Query OK, 0 rows affected (0.00 sec)  

注意,在命令列縮排時,不要用tab,不然會提示,

Display all 749 possibilities? (y or n)
? MBRINTERSECTS
ABS MBROVERLAPS

。。。 。。。。。。。

1行,建立一個預存程序,注意:如果我把out result varchar(90)改成out result varchar,返回的結果中只有一個字元。
2行,開始
3行,定義一個變數name
4行,定義變數pass
5行,定義一下結束標識
6行,定義一個游標       注意:declare 的內容不要放到if裡面,不然會報錯誤的。
7行,如果sqlstate等於02000時,把done設定成1,也就是找不到資料時
8,10,17行,if判斷
9行,根據參數,把資料取出來,放到result中
11行,開啟游標
12,15行,repeat迴圈,根php的do while原理一樣
13行,從游標中取出資料。
14行,將資料合併起來
16行,關閉游標
17,18行,標籤閉合。

3,測試結果

查看複製列印?
  1. mysql> call test_cursor(3,@test);  
  2. Query OK, 0 rows affected (0.00 sec)  
  3.   
  4. mysql> select @test;                             //這裡很像php中的,傳引用  
  5. +-----------+  
  6. | @test     |  
  7. +-----------+  
  8. | ying,ying |  
  9. +-----------+  
  10. 1 row in set (0.00 sec)  
  11.   
  12. mysql> call test_cursor('',@test);  
  13. Query OK, 0 rows affected, 1 warning (0.00 sec)  
  14.   
  15. mysql> select @test;  
  16. +-------------------------------------------------------+  
  17. | @test                                                 |  
  18. +-------------------------------------------------------+  
  19. | tank,tank,zhang,zhang,ying,ying,tank,zhang,tank,zhang |  
  20. +-------------------------------------------------------+  
  21. 1 row in set (0.00 sec) 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.