mysql存儲過程心得
問題:mysql存儲過程的意義?
存儲過程只在創造時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般 SQL 語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。 存儲過程會預先編譯好sql語句在數據庫服務器,提高了數據查詢的速度,減小了客戶端的壓力
速度快。尤其是對比較復雜的業務邏輯,減少了網絡間流量的消耗
存儲過程可以重復使用,可減少數據庫開發人員的工作量
安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權
當對數據庫進行復雜操作時(如對多個表進行 Update,Insert,Query,Delete 時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。這些操作,如果用程序來完成,就變成了一條條的 SQL 語句,可能要多次連接數據庫。而換成存儲,只需要連接一次數據庫就可以了。
問題:mysql存儲過程使用的時機?
一個業務對多個表進行查詢的時候比較適合
復雜的數據處理時,比如報表處理
多條件並且多表查詢時,如做分頁處理
mysql存儲過程的實戰教程
1 創建一個存儲過程
2.創建存儲函數
3.定義處理程序
方法一:捕獲sqlstate_value
Declare CONTINUE HANDLER FOR SQLSTATE ‘42S02’ SET @info=’cannot find’;
方法二:捕獲mysql_error_code
Declare CONTINUE HANDLER FOR 1146 SET @info=’con not find’;
方法三:是定義條件,然後調用
Declare can_not_find CONDITION FOR 1146;
Declare CONTINUE HANDLER FOR can_not_find set @info=’can not find’;
方法四:使用SQLWARNING
Declare exit handler for SQLWARNING SET @info=’error’;
方法五:使用not found
Declare exit handler for NOT FOUND SET @info=’can not find’;
方法六:使用SQLEXCEPTION
Declare EXIT HANDLERFOR SQLEXCEPTION SET @info=’error’;
4.定義光標
Declare cur_name varchar(20);
Declare cur_address varchar(20);
聲明光標
Declare cur_student CURSOR FOR select name,address from student;
打開光標
OPEN cur_student
使用光標
FETCH cur_student into cur_name,cur_address;
關閉光標
Close cur_student
5.循環控制流程
循環控制流程
l IF語句
If age=10 then
Elseif age=20 then
Else
End if;
l Case語句
CASE
WHEN THEN
WHER THEN
ELSE
END CASE;
l LOOP語句和LEAVE語句 LEAVE是跳出循環 add_num結束標簽
add_num LOOP
SET @count=@count+1;
If @count=100 then
LEAVE add_num;
END LOOP add_num;
l ITERATE語句 結束本次循環
add_num LOOP
SET @count=@count+1;
If @count=100 then
ITERATE add_num;
Select * from student;
END LOOP add_num;
l Repeat 語句
Repeat
Set @count=@count+1;
Unitl @count=100;
END Repeat;
l While語句
While @count<100 DO
SET @count=@count+1;
End while;
6.通過show命令來查看存儲過程和存儲函數信息
7.修改存儲過程和存儲函數的內容
8綜合實例
現在有一張student表,請創建一個存儲過程(輸入參數一:起始年齡,輸入參數二:結束年齡,輸出參數:符合的學生總數量)