日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集

發(fā)布時(shí)間:2024/10/8 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

摘要:本文主要講解了存儲(chǔ)過程的創(chuàng)建、調(diào)用、以及游標(biāo)的使用?,相信掌握了游標(biāo)????? 會(huì)對(duì)你有不錯(cuò)的幫助,有不足之處還請(qǐng)指教

導(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、此處很重要,我們?cè)诤竺娴难h(huán)例子中會(huì)詳細(xì)講解如何用,

(2、注意變量數(shù)必須與MySQL游標(biāo)返回的字段數(shù)以及類型一致,請(qǐng)看2,3步的標(biāo)紅處,

a的類型對(duì)應(yīng) id,b類型對(duì)應(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í)行該命令?,我們?cè)诖颂幱泻芏喾痔?hào),這樣很是不方便,?這種情況下,我只需

執(zhí)行如下命令:

執(zhí)行delimiter //

即可把分號(hào)結(jié)束換成//結(jié)束,然后在換回

delimiter ;

總結(jié)

以上是生活随笔為你收集整理的mysql 存储过程 select 循环_简简单单储存过程——循环一个select结果集的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。