mysql存儲過程 in out inout
存儲過程是一組預編譯好的sql語句,用來執行某個特定的功能。這樣可以省去sql解析、編譯、優化的過程,提高了執行效率,同時,在調用的時候只傳一個存儲過程的名稱,而不用傳一大堆sql語句,減少了網絡傳輸。也間接提高了執行效率。
存儲過程與自定義函數的區別
- 存儲過程是一組sql語句,為了實現某個獨立的功能,一般獨立執行。而自定義函數更多的作為其它sql語句的組成部分出現。
- 自定義函數只能有一個返回值,而存儲過程可以有多個返回值。
- 存儲過程功能復雜,函數針對性更強
存儲過程定義
存儲過程是sql語句和控制語句的預編譯集合,以一個名稱存儲並作為一個單元處理。
創建語法
create [definer = {user|current_user}] procedure proc_name ([參數[,....]]) some body code.... 參數: [in | out | inout] 參數名 類型 in 傳入的參數 out 返回的參數 inout 傳入 改變 並且返回的參數
調用語法
call proc_name(參數);
如果沒有參數,括號可以省略;
示例
創建沒有參數的存儲過程
create procedure ver()
select version();
調用
call ver(); 或 call ver;
當然這裏把一個函數放進一個存儲過程沒有什麽意義。只是單純為了舉例。
創建一個in參數的存儲過程
我們經常查詢id為某值的用戶,所以我們把它寫成一個存儲過程。
delimiter // create procedure findUserById(in userId int unsigned) begin select * from user where id = userId; end // delimiter ;
註意:參數名不要和數據表中的字段名相同,否則會出現意想不到的後果。
調用
call findUserById(1);
創建一個in 一個out參數的存儲過程
刪除一個用戶並且返回剩余用戶數量
delimiter //
create procedure delUserByIdAndReturnNums(in userId int unsigned,out nums int unsigned )
begin
delete from user where id=userId;
select count(id) from user into nums;
end //
delimiter ;
調用:
call delUserByIdAndReturnNums(1,@nums);調用過後我們就可以查看@nums的值了。
創建一個in多個out參數的存儲過程
刪除一個用戶並返回剩余用戶總數 和 被刪除用戶的姓名
delimiter //
create procedure delUser(in userId int ,out nums int,out username varchar(20))
begin
select name from user where id = userId into username;
delete from user where id = userId;
select count(id) from user into nums;
end //
delimiter ;
調用
call delUser(3,@nums,@username);
調用過後可以查看兩個變量的值。
select @nums;
select @username;
創建帶有inout參數的存儲過程
定義一個存儲過程,傳入一個整數得到其平方值。
delimiter //
create procedure square(inout num int)
begin
set num=num*num;
end //
delimiter ;
調用:
由於其參數是inout類型,所以我們需要傳入一個賦值過的變量,以便在存儲過程內部對其修改後返回。
set @num=3;
call square(@num);
select @num;
其結果如下:
mysql> set @num=3;
Query OK, 0 rows affected (0.00 sec)
mysql> call square(@num);
Query OK, 0 rows affected (0.02 sec)
mysql> select @num;
+------+
| @num |
+------+
| 9 |
+------+
1 row in set (0.00 sec)
mysql存儲過程 in out inout