MYSQL存儲過程即常用邏輯知識點總結(jié)
Mysql存儲過程
1.創(chuàng)建存儲過程語法(格式)
DELIMITER $ CREATE PROCEDURE 存儲過程名A(IN 傳入?yún)?shù)名a INT,IN 傳入?yún)?shù)名b VARCHAR(20),OUT 返回參數(shù)名c INT) BEGIN 內(nèi)容.......... END $
解析:
- IN 代表傳入的參數(shù),定義傳入?yún)?shù)名,并且后面跟上傳入?yún)?shù)類型(INT,VARCHAR,DOUBLE,........)
- OUT 代表存儲過程執(zhí)行完返回的數(shù)據(jù),定義參數(shù)名,并且后面跟上參數(shù)類型(INT,VARCHAR,DOUBLE,........)
- INOUT 代表既可以傳入也可以返回 ,定義參數(shù)名,并且后面跟上參數(shù)類型(INT,VARCHAR,DOUBLE,........)
2.存儲過程內(nèi)具體語法與邏輯
A.定義變量語法:
DECLARE 變量名a 參數(shù)類型(INT,VARCHAR(20),BOOLEAN,........) [DEFAULT NULL];
注:可以在參數(shù)類型后面加 DEFAULT NULL; 來設(shè)置初始值。
B.變量賦值:
方式1(直接對變量進行賦值):
SET 定義的變量a = NEW();
方式2(sql查詢的結(jié)果直接賦值給變量):
SELECT `student`.age INTO 定義的變量a FROM `student` WHERE...........
方式3(sql查詢的結(jié)果直接賦值給多個變量):
SELECT `student`.name AS 定義的變量a,`student`.age AS 定義的變量b INTO 定義的變量a,定義的變量b FROM `student` ...............
c.邏輯判斷:
#IF判斷:
IF 條件語句(3>5) THEN
條件為TRUE時執(zhí)行.........;
END IF;
#IF ELSE判斷:
IF 條件(a>0) THEN
條件為(a>0)時執(zhí)行........;
ELSE IF 條件(a<0) THEN
條件為(a<0)時執(zhí)行.......;
ELSE
其它執(zhí)行.......;
END IF;
D.游標,(LOOP)循環(huán):
#例.單游標循環(huán):create procedure my_procedure() -- 創(chuàng)建存儲過程 begin -- 開始存儲過程 declare my_id varchar(32); -- 自定義變量1 declare my_name varchar(50); -- 自定義變量2 DECLARE done INT DEFAULT FALSE; -- 自定義控制游標循環(huán)變量,默認false DECLARE cur CURSOR FOR ( SELECT id, name FROM t_people ); -- 定義游標并輸入結(jié)果集 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 綁定控制變量到游標,游標循環(huán)結(jié)束自動轉(zhuǎn)true OPEN cur; -- 打開游標 posLoop: LOOP -- 開始循環(huán)體,myLoop為自定義循環(huán)名,結(jié)束循環(huán)時用到 FETCH cur into my_id, my_name; -- 將游標當(dāng)前讀取行的數(shù)據(jù)順序賦予自定義變量12 IF done THEN -- 判斷是否繼續(xù)循環(huán) LEAVE posLoop; -- 結(jié)束循環(huán) END IF; -- 自己要做的事情,在 sql 中直接使用自定義變量即可 UPDATE t_user SET c_name = my_name WHERE id = my_id and rtrim(ltrim(c_name)) = ''; -- 左右去空格 COMMIT; -- 提交事務(wù) END LOOP posLoop; -- 結(jié)束自定義循環(huán)體 CLOSE cur; -- 關(guān)閉游標 END; -- 結(jié)束存儲過程
#例.多游標循環(huán):create procedure my_procedure() -- 創(chuàng)建存儲過程begin -- 開始存儲過程 declare my_id varchar(32); -- 自定義變量1 declare my_name varchar(50); -- 自定義變量2 DECLARE done INT DEFAULT FALSE; -- 自定義控制游標循環(huán)變量,默認false DECLARE cur_1 CURSOR FOR ( SELECT id, name FROM t_people ); -- 定義游標并輸入結(jié)果集 DECLARE cur_2 CURSOR FOR ( SELECT id_2,name_2 FROM t_people_2); --定義游標并輸入結(jié)果集 DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; -- 綁定控制變量到游標,游標循環(huán)結(jié)束自動轉(zhuǎn)true OPEN cur_1; -- 打開游標 posLoop: LOOP -- 開始循環(huán)體,myLoop為自定義循環(huán)名,結(jié)束循環(huán)時用到 FETCH cur_1 into my_id, my_name; -- 將游標當(dāng)前讀取行的數(shù)據(jù)順序賦予自定義變量12 IF done THEN -- 判斷是否繼續(xù)循環(huán) LEAVE posLoop; -- 結(jié)束循環(huán) END IF; -- 自己要做的事情,在 sql 中直接使用自定義變量即可 UPDATE ..........; --自己要做的具體操作 END LOOP posLoop; -- 結(jié)束自定義循環(huán)體 CLOSE cur_1; -- 關(guān)閉游標 SET done = FALSE; -- 因為當(dāng)?shù)谝粋€游標遍歷完后其值被handler設(shè)置為TRUE了,如果不用set把它設(shè)置為 FALSE ,那么第二個游標就不會遍歷了。(最好是在每個打開游標的操作前都用該語句,以確保游標能真正遍歷) OPEN cur_2; -- 打開游標 posLoop_2: LOOP -- 開始循環(huán)體,myLoop為自定義循環(huán)名,結(jié)束循環(huán)時用到 FETCH cur_2 into my_id, my_name; -- 將游標當(dāng)前讀取行的數(shù)據(jù)順序賦予自定義變量12 IF done THEN -- 判斷是否繼續(xù)循環(huán) LEAVE posLoop_2; -- 結(jié)束循環(huán) END IF; -- 自己要做的事情,在 sql 中直接使用自定義變量即可 INSERT ..........; --自己要做的具體操作 END LOOP posLoop_2; -- 結(jié)束自定義循環(huán)體 CLOSE cur_2; -- 關(guān)閉游標 END; -- 結(jié)束存儲過程
3.存儲過程的調(diào)用
#調(diào)用沒有返回值的存儲過程CALL 存儲過程名(參數(shù).....); #調(diào)用有返回值的存儲過程(獲得返回值) CALL 存儲過程名(@aaa); SELECT @aaa;
4.刪除存儲過程
DROP PROCEDURE 存儲過程名;
5.注意事項
存儲過程中的分號(;)很重要,盡量不要省略。
- 深入了解Mysql邏輯架構(gòu)
- MySQL高級學(xué)習(xí)筆記(三):Mysql邏輯架構(gòu)介紹、mysql存儲引擎詳解
- 詳解MySQL執(zhí)行原理、邏輯分層、更改數(shù)據(jù)庫處理引擎
- Mysql邏輯架構(gòu)詳解
- 關(guān)于避免MySQL替換邏輯SQL的坑爹操作詳解
- 利用PHP訪問MySql數(shù)據(jù)庫的邏輯操作以及增刪改查的實例講解
- MySql存儲過程之邏輯判斷和條件控制
- MySQL 利用frm文件和ibd文件恢復(fù)表數(shù)據(jù)
- MySQL使用binlog日志做數(shù)據(jù)恢復(fù)的實現(xiàn)
- MySQL 基于時間點的快速恢復(fù)方案
- MySQL5.7 mysqldump備份與恢復(fù)的實現(xiàn)
- MySQL 邏輯備份與恢復(fù)測試的相關(guān)總結(jié)
相關(guān)文章
MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器
這篇文章主要介紹了MySQL中的CONCAT()函數(shù):輕松拼接字符串的利器,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04
SQL函數(shù)實現(xiàn)Group_concat用法
GROUP_CONCAT用于將每個分組內(nèi)的值連接成一個字符串,并通過指定的分隔符進行分隔,本文主要介紹了SQL函數(shù)實現(xiàn)Group_concat用法,具有一定的參考價值,感興趣的可以了解一下2024-08-08
MySQL提示Truncated incorrect DOUBLE value解決方法
這篇文章給大家介紹了MySQL提示Truncated incorrect DOUBLE value報錯的四種解決方法,并通過代碼給大家介紹的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-02-02
MySQL性能監(jiān)控軟件Nagios的安裝及配置教程
這篇文章主要介紹了MySQL性能監(jiān)控軟件Nagios的安裝及配置教程,這里以CentOS操作系統(tǒng)為環(huán)境進行演示,需要的朋友可以參考下2015-12-12

