MySQL數(shù)據(jù)庫之存儲過程?procedure
前言:
stored procedure 完成特定功能的SQL語句集,存儲在數(shù)據(jù)庫中,經(jīng)過第一次編譯之后再次調(diào)用不需要編譯(效率較高)
1、存儲過程與函數(shù)的區(qū)別
1.1、相同點
- 都是為了可重復地執(zhí)行操作數(shù)據(jù)庫的SQL語句集合
- 都是一次編譯,多次執(zhí)行
1.2、不同點
- 標識符不同,函數(shù)function 過程 procedure
- 函數(shù)中有返回值,且必須返回,而過程沒有返回值
- 過程無返回值類型,不能將結(jié)果直接賦值給變量;函數(shù)有返回值類型,調(diào)用時,除了在select中,必須將返回值賦值給變量
- 函數(shù)可以再select語句中直接使用,而過程不能
2、存儲過程的操作
2.1、創(chuàng)建過程
基本語法:
create procedure 過程名字([參數(shù)列表])
bengin
過程體
end
結(jié)束符
如果只有只有一條指令可以省略begin和end
create procedure my_pro1() select * from my_student;
過程基本上可以完成函數(shù)對應的所有功能:
-- 修改語句結(jié)束符
delimiter $$
-- 創(chuàng)建過程
create procedure my_pro2()
begin
-- 求1到100之間的和
-- 創(chuàng)建局部變量
declare i int default 1;
-- declare sum int default 0;
-- 會話變量
set @sum = 0;
-- 開始循環(huán)獲取結(jié)果
while i <= 100 do
-- 求和
set @sum = @sum + i;
set i = i + 1;
end while;
-- 顯示結(jié)果
select @sum;
end
$$
delimiter ;2.2、查看過程
-- 查看所有存儲過程 show procedure status [like 'pattern']; -- 查看過程的創(chuàng)建語句 show create procedure 過程名字\G
2.3、調(diào)用過程
過程沒有返回值
基本語法:
call 過程名([實參列表]); -- eg: call my_pro2(); +------+ | @sum | +------+ | 5050 | +------+
2.4、刪除過程
基本語法:
drop procedure 過程名;
3、存儲過程的形參類型
存儲過程的參數(shù)和函數(shù)一樣,需要制定其類型
但是存儲過程對參數(shù)還有額外的要求,自己的參數(shù)分類:
- in:(值傳遞)參數(shù)從外部傳入,在過程內(nèi)部使用,可以是直接數(shù)據(jù),也可以是保存數(shù)據(jù)的變量
- out:(引用傳遞)參數(shù)在過程中賦值,傳入必須是變量,如果有外部數(shù)據(jù),會被清空為null
- inout:(引用傳遞)數(shù)據(jù)可以從外部傳入過程內(nèi)部使用,同時內(nèi)部操作之后,又回將數(shù)據(jù)返回給外部
代碼示例:
-- 創(chuàng)建3個會話變量
set @var1 = 1;
set @var2 = 2;
set @var3 = 3;
-- 查詢會話變量
select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
| 1 | 2 | 3 |
+-------+-------+-------+
1 row in set (0.00 sec)
-- 修改語句結(jié)束符
delimiter $$
-- 定義過程
create procedure my_pro3(in a int, out b int, inout c int)
begin
-- 查看傳入的3個數(shù)據(jù)值
select a, b, c;
-- +------+------+------+
-- | a | b | c |
-- +------+------+------+
-- | 1 | NULL | 3 |
-- +------+------+------+
-- 修改3個變量值
set a = 10;
set b = 20;
set c = 30;
select a, b, c;
-- +------+------+------+
-- | a | b | c |
-- +------+------+------+
-- | 10 | 20 | 30 |
-- +------+------+------+
-- 查看會話變量
select @var1, @var2, @var3;
-- +-------+-------+-------+
-- | @var1 | @var2 | @var3 |
-- +-------+-------+-------+
-- | 1 | 2 | 3 |
-- +-------+-------+-------+
-- 修改會話變量
set @var1 = 'a';
set @var2 = 'b';
set @var3 = 'c';
select @var1, @var2, @var3;
-- +-------+-------+-------+
-- | @var1 | @var2 | @var3 |
-- +-------+-------+-------+
-- | a | b | c |
-- +-------+-------+-------+
end
$$
delimiter ;
-- 調(diào)用過程
call my_pro3(@var1, @var2, @var3);
-- 再次查看會話變量
mysql> select @var1, @var2, @var3;
+-------+-------+-------+
| @var1 | @var2 | @var3 |
+-------+-------+-------+
| a | 20 | 30 |
+-------+-------+-------+分析:
- 1、實參傳入過程之后,實際上沒有改變外部變量的值,而是把值給了形參,out類型不能接收外部變量的值,默認為null
- 2、當過程執(zhí)行到end 的時候,如果是out或inout變量,會將形參的值重新賦值給實參變量
相關(guān)文章
MySQL和Oracle的元數(shù)據(jù)抽取實例分析
MySQL和Oracle雖然在架構(gòu)上有很大的不同,但是如果從某些方面比較起來,它們有些方面也是相通的,下面這篇文章主要給大家介紹了關(guān)于MySQL和Oracle元數(shù)據(jù)抽取的相關(guān)資料,需要的朋友可以參考下2021-12-12
MySQL使用Partition功能實現(xiàn)水平分區(qū)的策略
這篇文章主要介紹了MySQL使用Partition功能實現(xiàn)水平分區(qū),給大家提到了水平分區(qū)的5種策略,通過sql語句給大家介紹的非常詳細,需要的朋友可以參考下2021-12-12
mysql默認編碼為UTF-8 通過修改my.ini實現(xiàn)方法
這篇文章主要介紹了mysql默認編碼為UTF-8 通過修改my.ini實現(xiàn)方法的相關(guān)資料,為了防止出現(xiàn)亂碼,Latin1是不支持漢字的,所以要將其改為UTF-8或GBK,需要的朋友可以參考下2017-01-01
MySQL錯誤“Specified key was too long; max key length is 1000 b
今天在為數(shù)據(jù)庫中的某兩個字段設(shè)置unique索引的時候,出現(xiàn)了Specified key was too long; max key length is 1000 bytes錯誤2010-08-08

