Mysql系列 儲存過程 重點游標

2021-09-24 10:56:40 字數 1875 閱讀 7592

儲存過程的簡單認識,當乙個事務涉及到多個sql語句時或者涉及到對多個表的操作時就要考慮用儲存過程;當在乙個事務的完成需要很複雜的商業邏輯時(比如,對多個資料的操作,對 多個狀態的判斷更改等)要考慮;還有就是比較複雜的統計和彙總也要考慮,但是過多的使用儲存過程會降低系統的移植性。

帶輸入引數的儲存過程,迴圈新增記錄

(想試用的東西很多,所以邏輯沒大在意)

create definer=`root`@`localhost` procedure `add_test`(in i int)

begin

declare j int;

declare total int;

set j = i;

set total = 1;

while total < j do

insert into test_wjh (name,total) values ('wjh',total);

set total = total+1;

end while;

end

輸入引數i,再賦值j作為迴圈次數,為test_wjh表動態插入記錄。

2.游標使用,含多字段

create definer=`root`@`localhost` procedure `wjh`()

begin

-- 游標結束的標誌

declare done int default 0;

declare wid int(11) ;

declare wname varchar(32) default '';

declare wtotal int(11) ;

declare wsum int(11) default 0;

declare cur_wjh cursor for select id,name,total from test_wjh;

-- 游標結束要用到的標誌設定為1,結束游標迴圈所要做的業務

declare continue handler for not found set done = 1;

-- declare continue handler for sqlstate '02000' set done = 1;

-- 開啟游標

open cur_wjh;

while done=0 do

fetch cur_wjh into wid,wname,wtotal;

-- 一定再次要判斷done的值,不然會最後一次遍歷會重複

if done=0 then

-- select wid,wname,wtotal; 自己的業務邏輯

set wsum = wsum+wtotal;

end if;

-- 結束

end while;

-- 關閉游標

close cur_wjh;

select wname,wsum;

end

cur_wjh是我的游標名,游標可以理解成把我查詢的結果每一行分解,迴圈。

其中有乙個坑,就是游標遍歷,最後一行的重複一次。

原因:最後一次通過迴圈遍歷的時候,「fetch」是失敗的,如果這個時候繼續處理,你會插入前一次的值。

解決方法:如我所寫的,fetch後馬上加上if判斷done的值,再進行業務邏輯

以上結果是:

上面用到的表為:

mysql 游標 儲存過程

1.首先需要注意的是mysql中游標必須要建立在儲存過程中 2.直接上sql 查詢當天資料 select in flow out flow from water meter data where 1 1 and date sys read time curdate 1 order by in flo...

MySQL 儲存過程 游標

儲存過程 本儲存過程有特殊執行迴圈數量的要求,是對security market history表進行修正 判斷儲存過程是否存在 drop procedure if exists proc security market history update create procedure proc se...

mysql 儲存過程 游標

宣告游標 declare cursor name cursor for select statement 這個語句宣告乙個游標。也可以在子程式中定義多個游標,但是乙個塊中的每乙個游標必須有唯一的名字。開啟游標 open cursor name 這個語句開啟先前宣告的游標。游標fetch fetch ...