1,什么是存儲過程、函數
存儲過程和函數是從5.0版本開始支持的,兩者在定義上十分類似的,都是事先經過編譯和存儲在數據庫中的SQL語句的集合,就相當於java中的方法。
2,存儲過程、函數的好處
1,對於開發人員來說,可以極大的簡化他們的工作。
2,將有關數據的處理都放在了數據庫端,這樣就減少了數據庫和應用服務器之間的傳輸,提高了數據的處理效率。
3,存儲過程和函數的區別
1,函數必須有返回值,存儲過程沒有。
2,存儲過程的參數可以是IN,OUT或者INOUT類型,而函數只能是IN類型。
4,存儲過程的小案例
下面的小案例是在Navicat中實現的。
寫案例之前先准備一個簡單的表格:
CREATE TABLE `users` ( `u_id` int(4) NOT NULL AUTO_INCREMENT, `u_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL, `u_age` int(4) DEFAULT NULL, PRIMARY KEY (`u_id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
插入以上幾條數據。
在Navicat中新建存儲過程的步驟:右擊‘函數’->新建函數->過程->選擇參數->完成
1,創建一個無參的
CREATE DEFINER=`root`@`localhost` PROCEDURE `noParamName_select`() BEGIN #Routine body goes here... select u_name as '用戶名' from users where u_id = 1; END
我們只需要寫BEGIN和END之間的代碼就好了,其他的Navicat會為我們創建好。
#無參
call noParamName_select();#調用方式是用call關鍵字
2,IN類型參數
CREATE DEFINER=`root`@`localhost` PROCEDURE `inParamName_select`(IN `user_id` int) BEGIN #Routine body goes here... select u_name as '用戶名' from users where u_id = user_id; END
改過程的作用是根據輸入的用戶id,查詢對應的用戶名
#IN參數 call inParamName_select(2);
3,OUT類型參數
CREATE DEFINER=`root`@`localhost` PROCEDURE `outParamName_select`(OUT `user_name` varchar(20)) BEGIN #Routine body goes here... select u_name into user_name from users where u_id = 2; END
這里要注意,形參類型把varchar后面一定要加長度,否則就會出現錯誤
#OUT參數查id call outParamId_select(@a);
select @a;
對於OUT類型的參數,在調用函數時也要傳參,使用@開頭,因為OUT類型的參數的是作為輸出,所以最后使用select進行查詢。
4,IN類型參數和OUT類型參數一起用
CREATE DEFINER=`root`@`localhost` PROCEDURE `inAndOutParamName_select`(IN `user_id` int,OUT `user_name` varchar(20)) BEGIN #Routine body goes here... select u_name into user_name from users where u_id = user_id; END
#同時使用IN和OUT參數查詢用戶名 call inAndOutParamName_select(1,@n); select @n as '用戶名';
5,INOUT參數,既作為輸入又作為輸出。
BEGIN #Routine body goes here... set @number = num; #設置變量 select @number + 10 into num; END
#INOUT參數 set @num = 2; call inoutParamName_select(@num); select @num;