1.什么是mysql存儲過程 存儲過程[Stored Procedure]是一組[或者是若干條SQL]為了完成特定功能的SQL語句集,經編譯后存儲在數據庫中,用戶通過指定存儲過程的名字并給定參數[如果該存儲過程帶有參數]來調用執行它。
2.存儲過程的創建
--創建語法:
```
create procedure procedureName() --同一個數據庫中,存儲過程名具有唯一性
begin
#SQL語句集
end
```
舉個栗子:創建一個查詢當前時間的存儲過程
```
delimiter $$
create procedure procedureName()
begin
select now() as nowtime;
end $$
delimiter;
```
這樣我們就完成了第一個存儲過程的創建,創建成功之后我們如何調用呢,在你的SQL語句中,只需要
```
call procedureName() --select 存儲過程名 即可調用
```
```
當然,你還可以查看所有的存儲過程:
show procedure status;
```
3.存儲過程中變量的引用 存儲過程中可以通過引用變量來完成復雜的編程,在存儲過程中使用 declare 來聲明變量,
格式如下:
```
declare 變量名[一般不以@開頭且具有一定意義[@是mysql的關鍵字]] 變量類型[變量類型包括:數值類型[tinyint,int/integer,bigint,float,double,decimal],時間日期類型,字符串類型,][default 默認值[可選]]
```
又一個栗子:
```
delimiter $$ --delimiter 定義結束符
create procedure procedureName()
begin --開始存儲過程
declare age int default 18; --聲明一個int類型的age變量,并且默認值為18
declare myname varchar(255) default 'xiaoxiao'; --聲明一個myname的varchar類型的變量,默認值為'xiaoxiao'
select CONCAT(myname,age) as descr; --查詢剛剛定義的變量并取別名為descr
end $$ --結束存儲過程
delimiter; --將mysql的存儲過程設置為 ;
```
既然我們可以為存儲過程賦值,那么我們可以想到是否可以在存儲過程中進行變量的計算,答案也是也可以的,再來一個栗子:
```
delimiter $$
create procedure procedureName()
begin
declare age int default 18;
declare height int default 171;
set age := age + 18; -- 變量的加法運算,變量的運算格式為,set 變量名 := 變量名 運算符[+,-,* ,/]值
select age;
end $$
delimiter;
--調用
call procedureName() --結果為 age 36
```
4.mysql中的流程控制
舉個栗子說明一下:
```
delimiter $$
create procedure procedureName()
begin
declare age int default 18;
declare height int default 171;
set age := age + 18; -- 變量的加法運算,變量的運算格式為,set 變量名 := 變量名 運算符(+,-,* ,/)值
if age > 30 then
select '30歲,中年啦';
else
select '小年輕';
end if; -- end if結束if語句塊
end $$
delimiter;
```
調用的結果為:'30歲,中年啦';
類似的語句還有 case...when...
5.存儲過程參數的傳遞
存儲過程主要分為三種參數類型,in[輸入參數],out[輸出參數],INOUT[輸入輸出參數] IN[輸入]參數類型:該參數的值必須在調用存儲過程時指定,如果在調用存儲過程中修改該參數的值則該值不能被返回
IN參數類型:
基本格式:
```
delimiter $$
create procedure InType(in type char) -- 參數類型[IN/OUT/INOUT,參數名,參數類型[int,char,varchar等...]]
begin
IF type='A' THEN
SELECT '我是IN參數A';
ELSEIF type='B' THEN
SELECT '我是IN參數B';
ELSE
SELECT '其他';
END IF;
end $$
delimiter;
```
調用:
```
call InType('A'); -- 輸出'我是IN參數A'
```
OUT[輸出]參數類型:
```
delimiter $$
create procedure outType(OUT type int)
begin
secelt type = 1+2;
end $$
delimiter;
```
調用:
```
call outType(@type); --輸出 3
```
INOUT[輸入輸出]參數類型:
```
delimiter $$
create procedure inoutType(INOUT ntime INT)
begin
declare nowtime INT(11); --定義變量
IF ntime > (select unix_timestamp) THEN --判斷
SET nowtime = (select unix_timestamp);
ELSE
SET nowtime = ntime;
END IF;
SET ntime = nowtime; --返回賦值
end $$
delimiter;
-- 傳遞一個時間戳,mysql對當前時間戳進行判斷,如果傳遞進來的時間戳大于當前時間戳,設置nowtime變量為當前時間戳,否則則為傳遞進來的時間戳,并輸出結果
```
一個開發過程中使用存儲過程快速填充表的栗子:
栗子中user表有四個字段,分別為,name,age,sex,is_delete,快速為表填充6百萬的測試數據,如下:
```
delimiter $$
create procedure fillData()
begin
set @i =1; --set 定義變量
while @i<=6000000 do --開始循環,循環變量小于6000000
insert into user (name,age,sex,is_delete)values(CONCAT("我是第",@i,"個name"),(SELECT RAND() * 20),(SELECT RAND() * 2),(SELECT RAND() * 1)); --批量向表里面插入6百萬條數據,CONCAT為拼接字符串
set @i = @i+1; --變量累加
end while; --結束循環
end $$
delimiter;
```