摘要:本文主要講解了存儲過程的創(chuàng)建、調(diào)用、以及游標(biāo)的使用,相信掌握了游標(biāo) 會對你有不錯的幫助,有不足之處還請指教
導(dǎo)航: 一、存儲過程的創(chuàng)建及調(diào)用
二 、游標(biāo)的使用
三、 示例
四、補充
說明:
1、用到的兩個數(shù)據(jù)表:
from_data
to_data
2、示例需求 : 將表from_data 的select結(jié)果集循環(huán)插入到表to_data;
偽代碼: while 循環(huán) select id ,name from_data
insert into to_data(id,name) value(from_data.id,from_data.name)
end
3、環(huán)境: mysql
一、存儲過程的創(chuàng)建及調(diào)用
我們創(chuàng)建一個名叫 add_test的存儲過程
1 、檢查是否有 add_test
- drop procedure if exists add_test;
2、創(chuàng)建
- create procedure add_test()
- (
- #[in|out|inout] 參數(shù) datatype
-
-
- a int;
- b int;
- )
- begin
- #SQL 語句;
-
-
-
- end;
3、調(diào)用
以上就是基本的創(chuàng)建方法,注意已下幾點:
1 、在建立和調(diào)用時,add_test后面的“()”是必須的
2、MySQL 存儲過程參數(shù)如果不顯式指定“in”、“out”、“inout”,則默認(rèn)為“in”,并且參數(shù)不能指定默認(rèn)值。
3、包含多條 SQL 語句時,需要 begin end 關(guān)鍵字,在begin end里面的每條語句的末尾,都要加上分號 “;”
4、在begin end里面聲明變量,使用關(guān)鍵字 DECLARE,如:
- begin
-
- #聲明一個name變量,類型是varchar(記得分號)
- name varchar(32);
- end;
二 、游標(biāo)的使用
1、定義游標(biāo)
- /*
- 定義游標(biāo)的關(guān)鍵字:CURSOR。
- 定義游標(biāo)cursor_name,
- 游標(biāo)cursor_name當(dāng)前指針的記錄
- 是一個表from_data的多行結(jié)果集
- */
- DECLARE cursor_name CURSOR FOR select id,name
-
- from from_data;
2、打開游標(biāo)
- #關(guān)鍵字:OPEN
- OPEN cursor_name;
3、 獲取游標(biāo)
- #聲明兩個變量
- DECLARE a int
-
- ;
- DECLARE b varchar(32)
-
- ;
-
- /*
- FETCH 獲取游標(biāo)當(dāng)前指針的記錄,并傳給指定變量 a 、b
- */
- FETCH cursor_name INTO a,b;
注意:(1、此處很重要,我們在后面的循環(huán)例子中會詳細(xì)講解如何用,
(2、注意變量數(shù)必須與MySQL游標(biāo)返回的字段數(shù)以及類型一致,請看2,3步的標(biāo)紅處,
a的類型對應(yīng) id,b類型對應(yīng)name
4、關(guān)閉游標(biāo)
以上就是游標(biāo)的常見使用方法,關(guān)鍵的部分我已在每一步中說明,就不在多說了,現(xiàn)在我們看下例子:
三、示例
- drop procedure if exists add_test;
- # 創(chuàng)建存儲過程 add_test
-
-
- CREATE PROCEDURE add_test()
-
- BEGIN
- #定義 變量
-
-
- DECLARE a int;
- DECLARE b VARCHAR(30);
-
- #此變可有可無,為了給個該存儲函數(shù)執(zhí)行成功后給個提示,運行下便知道
-
-
- DECLARE str VARCHAR(300);
- DECLARE x int;
-
- #這個用于處理游標(biāo)到達(dá)最后一行的情況
-
-
- DECLARE s int default 0;
-
- #聲明游標(biāo)cursor_name(cursor_name是個多行結(jié)果集)
-
-
- DECLARE cursor_name CURSOR FOR select id ,name from from_data;
-
- #設(shè)置一個終止標(biāo)記
-
-
- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;
-
-
- set str = "--";
- #打開游標(biāo)
-
-
- OPEN cursor_name;
-
- #獲取游標(biāo)當(dāng)前指針的記錄,讀取一行數(shù)據(jù)并傳給變量a,b
-
-
- fetch cursor_name into a,b;
- #開始循環(huán),判斷是否游標(biāo)已經(jīng)到達(dá)了最后作為循環(huán)條件
-
-
- while s <> 1 do
- set str = concat(str,x);
-
- insert into to_data(id,name) values(a,b);
- #讀取下一行的數(shù)據(jù)
-
-
- fetch cursor_name into a,b;
-
- end while;
-
- #關(guān)閉游標(biāo)
-
-
- CLOSE cursor_name ;
-
- select str;
-
- #語句執(zhí)行結(jié)束
-
-
- END;
-
- #調(diào)用存儲函數(shù)add_test
-
-
- CALL add_test()
四、補充-關(guān)于ssh上運行
由于mysql的解釋器默認(rèn)情況下,delimiter是分號;。在命令行客戶端中,如果有一行命令以分號結(jié)束,
那么回車后,mysql將會執(zhí)行該命令,我們在此處有很多分號,這樣很是不方便,這種情況下,我只需
執(zhí)行如下命令:
執(zhí)行delimiter //
即可把分號結(jié)束換成//結(jié)束,然后在換回
delimiter ;