搜尋熱詞
例1、一個簡單存儲過程遊标執行個體
DELIMITER $$
DROP PROCEDURE IF EXISTS getUserInfo $$
CREATE PROCEDURE getUserInfo(in date_day datetime)
--
-- 執行個體
-- 存儲過程名為:getUserInfo
-- 參數為:date_day日期格式:2008-03-08
--
BEGIN
declare _userName varchar(12); -- 使用者名
declare _chinese int ; -- 國文
declare _math int ; -- 數學
declare done int;
-- 定義遊标
DECLARE rs_cursor CURSOR FOR SELECT username,chinese,math from userInfo where datediff(createDate,date_day)=0;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
-- 擷取昨天的日期
if date_day is null then
set date_day = date_add(now(),interval -1 day);
end if;
open rs_cursor;
cursor_loop:loop
FETCH rs_cursor into _userName,_chinese,_math; -- 取資料
if done=1 then
leave cursor_loop;
end if;
-- 更新表
update infoSum set total=_chinese+_math where UserName=_userName;
end loop cursor_loop;
close rs_cursor;
END$$
DELIMITER ;
例2、存儲過程遊标循環跳出現
在MysqL的存儲過程中,遊标操作時,需要執行一個conitnue的操作.衆所周知,MysqL中的遊标循環操作常用的有三種,LOOP,REPEAT,WHILE.三種循環,方式大同小異.以前從沒用過,是以記下來,友善以後查閱.
1.REPEAT
REPEAT
Statements;
UNTIL expression
END REPEAT
demo
DECLARE num INT;
DECLARE my_string VARCHAR(255);
REPEAT
SET my_string =CONCAT(my_string,num,',');
SET num = num +1;
UNTIL num <5
END REPEAT;
2.WHILE
WHILE expression DO
Statements;
END WHILE
demo
DECLARE num INT;
DECLARE my_string VARCHAR(255);
SET num =1;
SET str ='';
WHILE num < span>10DO
SET my_string =CONCAT(my_string,');
SET num = num +1;
END WHILE;
3.LOOP(這裡面有非常重要的ITERATE,LEAVE)
代碼如下 複制代碼
DECLARE num INT;
DECLARE str VARCHAR(255);
SET num =1;
SET my_string ='';
loop_label: LOOP
IF num <10THEN
LEAVE loop_label;
ENDIF;
SET num = num +1;
IF(num mod3)THEN
ITERATE loop_label;
ELSE
SET my_string =CONCAT(my_string,');
ENDIF;
END LOOP;
PS:可以這樣了解ITERATE就是我們程式中常用的contiune,而ITERATE就是break.當然在MysqL存儲過程,需要循環結構有個名稱,其他都是一樣的.
例3,MysqL 存儲過程中使用多遊标
先建立一張表,插入一些測試資料:
DROP TABLE IF EXISTS netingcn_proc_test;
CREATE TABLE `netingcn_proc_test` (
`id` INTEGER(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`password` VARCHAR(20),
PRIMARY KEY (`id`)
)ENGINE=InnoDB;
insert into netingcn_proc_test(name,password) values
('procedure1','pass1'),
('procedure2','pass2'),
('procedure3','pass3'),
('procedure4','pass4');下面就是一個簡單存儲過程的例子:
drop procedure IF EXISTS test_proc;
delimiter //
create procedure test_proc()
begin
-- 聲明一個标志done, 用來判斷遊标是否周遊完成
DECLARE done INT DEFAULT 0;
-- 聲明一個變量,用來存放從遊标中提取的資料
-- 特别注意這裡的名字不能與由遊标中使用的列明相同,否則得到的資料都是NULL
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
-- 聲明遊标對應的 sql 語句
DECLARE cur CURSOR FOR
select name,password from netingcn_proc_test;
-- 在遊标循環到最後會将 done 設定為 1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 執行查詢
open cur;
-- 周遊遊标每一行
REPEAT
-- 把一行的資訊存放在對應的變量中
FETCH cur INTO tname,tpass;
if not done then
-- 這裡就可以使用 tname, tpass 對應的資訊了
select tname,tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur;
end
//
delimiter ;
-- 執行存儲過程
call test_proc();
需要注意的是變量的聲明、遊标的聲明和HANDLER聲明的順序不能搞錯,必須是先聲明變量,再申明遊标,最後聲明HANDLER。上述存儲過程的例子中隻使用了一個遊标,那麼如果要使用兩個或者更多遊标怎麼辦,其實很簡單,可以這麼說,一個怎麼用兩個就是怎麼用的。例子如下:
drop procedure IF EXISTS test_proc_1;
delimiter //
create procedure test_proc_1()
begin
DECLARE done INT DEFAULT 0;
DECLARE tid int(11) DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
DECLARE cur_1 CURSOR FOR
select name,password from netingcn_proc_test;
DECLARE cur_2 CURSOR FOR
select id,name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_1;
REPEAT
FETCH cur_1 INTO tname,tpass;
if not done then
select tname,tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur_1;
-- 注意這裡,一定要重置done的值為 0
set done = 0;
open cur_2;
REPEAT
FETCH cur_2 INTO tid,tname;
if not done then
select tid,tname;
end if;
UNTIL done END REPEAT;
CLOSE cur_2;
end
//
delimiter ;
call test_proc_1();
上述代碼和第一個例子中基本一樣,就是多了一個遊标聲明和周遊遊标。這裡需要注意的是,在周遊第二個遊标前使用了set done = 0,因為當第一個遊标周遊玩後其值被handler設定為1了,如果不用set把它設定為 0 ,那麼第二個遊标就不會周遊了。當然好習慣是在每個打開遊标的操作前都用該語句,確定遊标能真正周遊。當然還可以使用begin語句塊嵌套的方式來處理多個遊标,例如:
drop procedure IF EXISTS test_proc_2;
delimiter //
create procedure test_proc_2()
begin
DECLARE done INT DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE tpass varchar(50) DEFAULT NULL;
DECLARE cur_1 CURSOR FOR
select name,tpass;
end if;
UNTIL done END REPEAT;
CLOSE cur_1;
begin
DECLARE done INT DEFAULT 0;
DECLARE tid int(11) DEFAULT 0;
DECLARE tname varchar(50) DEFAULT NULL;
DECLARE cur_2 CURSOR FOR
select id,name from netingcn_proc_test;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
open cur_2;
REPEAT
FETCH cur_2 INTO tid,tname;
if not done then
select tid,tname;
end if;
UNTIL done END REPEAT;
CLOSE cur_2;
end;
end
//
delimiter ;
call test_proc_2();
總結
以上是程式設計之家為你收集整理的MySQL存儲過程使用執行個體詳解全部内容,希望文章能夠幫你解決MySQL存儲過程使用執行個體詳解所遇到的程式開發問題。
如果覺得程式設計之家網站内容還不錯,歡迎将程式設計之家網站推薦給程式員好友。
本圖文内容來源于網友網絡收集整理提供,作為學習參考使用,版權屬于原作者。