mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集
摘要:本文主要講解了存儲(chǔ)過程的創(chuàng)建、調(diào)用、以及游標(biāo)的使用?,相信掌握了游標(biāo)????? 會(huì)對你有不錯(cuò)的幫助,有不足之處還請指教
導(dǎo)航?: 一、存儲(chǔ)過程的創(chuàng)建及調(diào)用
二 、游標(biāo)的使用
三、? 示例
四、補(bǔ)充
說明:
1、用到的兩個(gè)數(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
一、存儲(chǔ)過程的創(chuàng)建及調(diào)用
我們創(chuàng)建一個(gè)名叫 add_test的存儲(chǔ)過程
1 、檢查是否有 add_test
Sql代碼??
drop procedure if exists add_test;
2、創(chuàng)建
Sql代碼??
create procedure add_test()
(#[in|out|inout] 參數(shù) datatype
a int;
b int;
)
begin#SQL 語句;
end;
3、調(diào)用
Sql代碼??
call add_test(1,2);
以上就是基本的創(chuàng)建方法,注意已下幾點(diǎn):
1 、在建立和調(diào)用時(shí),add_test后面的“()”是必須的
2、MySQL 存儲(chǔ)過程參數(shù)如果不顯式指定“in”、“out”、“inout”,則默認(rèn)為“in”,并且參數(shù)不能指定默認(rèn)值?。
3、包含多條 SQL 語句時(shí),需要 begin end 關(guān)鍵字,在begin end里面的每條語句的末尾,都要加上分號(hào) “;”
4、在begin end里面聲明變量,使用關(guān)鍵字?DECLARE?,如:
Sql代碼??
begin#聲明一個(gè)name變量,類型是varchar(記得分號(hào))
name varchar(32);end;
二 、游標(biāo)的使用
1、定義游標(biāo)
Sql代碼??
/*定義游標(biāo)的關(guān)鍵字:CURSOR。
定義游標(biāo)cursor_name,
游標(biāo)cursor_name當(dāng)前指針的記錄
是一個(gè)表from_data的多行結(jié)果集*/
DECLARE cursor_name CURSOR FOR select id,name
from from_data;
2、打開游標(biāo)
Sql代碼??
#關(guān)鍵字:OPEN
OPEN cursor_name;
3、 獲取游標(biāo)
Sql代碼??
#聲明兩個(gè)變量
DECLAREa int
;DECLARE b varchar(32)
;/*FETCH 獲取游標(biāo)當(dāng)前指針的記錄,并傳給指定變量 a 、b*/FETCH cursor_name INTO a,b;
注意:(1、此處很重要,我們在后面的循環(huán)例子中會(huì)詳細(xì)講解如何用,
(2、注意變量數(shù)必須與MySQL游標(biāo)返回的字段數(shù)以及類型一致,請看2,3步的標(biāo)紅處,
a的類型對應(yīng) id,b類型對應(yīng)name
4、關(guān)閉游標(biāo)
Sql代碼??
CLOSE cursor_name ;
以上就是游標(biāo)的常見使用方法,關(guān)鍵的部分我已在每一步中說明,就不在多說了,現(xiàn)在我們看下例子:
三、示例
Sql代碼??
1 drop procedure ifexists add_test;2 #創(chuàng)建存儲(chǔ)過程 add_test
3
4
5 CREATE PROCEDURE add_test()6
7 BEGIN8 #定義 變量
9
10
11 DECLAREa int;12 DECLARE b VARCHAR(30);13
14 #此變可有可無,為了給個(gè)該存儲(chǔ)函數(shù)執(zhí)行成功后給個(gè)提示,運(yùn)行下便知道
15
16
17 DECLARE str VARCHAR(300);18 DECLAREx int;19
20 #這個(gè)用于處理游標(biāo)到達(dá)最后一行的情況
21
22
23 DECLARE s int default 0;24
25 #聲明游標(biāo)cursor_name(cursor_name是個(gè)多行結(jié)果集)
26
27
28 DECLARE cursor_name CURSOR FOR select id ,name from from_data;29
30 #設(shè)置一個(gè)終止標(biāo)記
31
32
33 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET s=1;34
35
36 set str = "--";37 #打開游標(biāo)
38
39
40 OPEN cursor_name;41
42 #獲取游標(biāo)當(dāng)前指針的記錄,讀取一行數(shù)據(jù)并傳給變量a,b
43
44
45 fetch cursor_name into a,b;46 #開始循環(huán),判斷是否游標(biāo)已經(jīng)到達(dá)了最后作為循環(huán)條件
47
48
49 while s <> 1 do
50 set str = concat(str,x);51
52 insert into to_data(id,name) values(a,b);53 #讀取下一行的數(shù)據(jù)
54
55
56 fetch cursor_name into a,b;57
58 end while;59
60 #關(guān)閉游標(biāo)
61
62
63 CLOSE cursor_name ;64
65 select str;66
67 #語句執(zhí)行結(jié)束
68
69
70 END;71
72 #調(diào)用存儲(chǔ)函數(shù)add_test
73
74
75 CALL add_test()
四、補(bǔ)充-關(guān)于ssh上運(yùn)行
由于mysql的解釋器默認(rèn)情況下,delimiter是分號(hào);?。在命令行客戶端中,如果有一行命令以分號(hào)結(jié)束,
那么回車后,mysql將會(huì)執(zhí)行該命令?,我們在此處有很多分號(hào),這樣很是不方便,?這種情況下,我只需
執(zhí)行如下命令:
執(zhí)行delimiter //
即可把分號(hào)結(jié)束換成//結(jié)束,然后在換回
delimiter ;
總結(jié)
以上是生活随笔為你收集整理的mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 李贺为什么被称作诗鬼(唐代诗人李贺为什么
- 下一篇: 货物年周转量是怎么计算的