MySQL存储过程实例
(作者:陳玓玏)
定義
存儲(chǔ)過程在我的理解里,類似函數(shù)的定義,設(shè)定好了函數(shù)的輸入、輸出參數(shù)、類型,寫好了流程,存在數(shù)據(jù)庫里,想用的時(shí)候隨時(shí)可以調(diào)用,不需要重新寫sql語句,效率很高。而且一般的sql語句間沒有邏輯控制,利用存儲(chǔ)過程卻可以完成很復(fù)雜的邏輯控制,加上優(yōu)化的sql算法,靈活性和功能性都大大提高。
存儲(chǔ)過程的結(jié)構(gòu)
語法:CREATE PROCEDURE 過程名([[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型[,[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類型…]]) [特性 …] 過程體
參數(shù)
存儲(chǔ)過程根據(jù)需要可能會(huì)有輸入、輸出、輸入輸出參數(shù),如果有多個(gè)參數(shù)用”,”分割開。MySQL存儲(chǔ)過程的參數(shù)用在存儲(chǔ)過程的定義,共有三種參數(shù)類型,IN,OUT,INOUT:
IN參數(shù)的值必須在調(diào)用存儲(chǔ)過程時(shí)指定,在存儲(chǔ)過程中修改該參數(shù)的值不能被返回,為默認(rèn)值
OUT:該值可在存儲(chǔ)過程內(nèi)部被改變,并可返回
INOUT:調(diào)用時(shí)指定,并且可被改變和返回
我用的是MySQL-Front,在數(shù)據(jù)庫名上點(diǎn)擊右鍵,新建過程就可以創(chuàng)建存儲(chǔ)過程,在數(shù)字1標(biāo)記的地方點(diǎn)擊右鍵,新建過程,創(chuàng)建存儲(chǔ)過程,在數(shù)字2標(biāo)記的地方調(diào)用存儲(chǔ)過程,當(dāng)然,也可以通過python連接數(shù)據(jù)庫來調(diào)用,在數(shù)字3標(biāo)記的地方查看運(yùn)行結(jié)果。
分別調(diào)用以下三句話:
SET @p_in=1; CALL in_param(@p_in); SELECT @p_in;輸出結(jié)果分別是:1,2,1
-- 輸出參數(shù)例子CREATE PROCEDURE out_param(OUT p_out int)BEGINSELECT p_out;SET p_out=2;SELECT p_out;END;分別調(diào)用以下命令:
SET @p_out=1; CALL out_param(@p_out); SELECT @p_out;輸出結(jié)果分別是:
空,2,2
分別調(diào)用以下命令:
SET @p_inout=1; CALL inout_param(@p_inout) ; SELECT @p_inout;輸出結(jié)果分別是:
1,2,2
五、有沒有更完整的例子?
帶if else語句的存儲(chǔ)過程:
調(diào)用
SET @parameter=1; CALL proc3(@parameter);結(jié)果:
由于設(shè)置的輸入?yún)?shù)為1,則表mysql_study.score中所有的degree值加2。
帶循環(huán)語句的存儲(chǔ)過程:(MySQL沒有for循環(huán),只有WHILE-DO…END-WHILE、REPEAT…END REPEAT和LOOP…END LOOP)
CREATE DEFINER=`root`@`localhost` PROCEDURE `proc7`(In v INT) BEGINDECLARE v INT;SET v=0;LOOP_LABLE:LOOP-- INSERT INTO mysql_study.score (degree) VALUES (v);select degree from mysql_study.score where degree>90-v ;SET v=v+1;IF v >=5 THENLEAVE LOOP_LABLE;END IF;END LOOP;END;調(diào)用
SET @v=4; CALL proc7(@v); SELECT @v;輸出結(jié)果:有五次輸出,分別是輸出>85、86、87、88、89的所有分?jǐn)?shù)列表。
六、輸入?yún)?shù)為可以為list變量嗎?
可是可以,但是貌似有點(diǎn)麻煩。
參考地址:https://segmentfault.com/q/1010000003003758,我自己沒試過,但是看別人是這么回答的,下次有時(shí)間試一下。上面的代碼都是可用的,我自己修改、測(cè)試通過了的。
–測(cè)試
-- select * from a -- exec sp_split_string '102,103,105,106,107,108,200,500,306,408' -- select * from aOracle的,也沒測(cè)試過:
https://blog.csdn.net/weeknd/article/details/78412668,https://blog.csdn.net/weeknd/article/details/78412668
如果有同學(xué)知道在存儲(chǔ)過程中傳入list參數(shù)的簡(jiǎn)單方法,也可以留言分享,不過也許直接通過python或者java來調(diào)用單次操作的存儲(chǔ)過程是最簡(jiǎn)單的吧。
參考文章:https://www.cnblogs.com/mark-chan/p/5384139.html,https://www.cnblogs.com/mark-chan/p/5384139.html
總結(jié)
以上是生活随笔為你收集整理的MySQL存储过程实例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 国科大学习资料--矩阵分析与应用(李保滨
- 下一篇: linux cmake编译源码,linu