出自:https://www.cnblogs.com/mark-chan/p/5384139.html
存儲過程(Stored Procedure)是在大型數(shù)據(jù)庫系統(tǒng)中呻拌,一組為了完成特定功能的SQL 語句集,它存儲在數(shù)據(jù)庫中,一次編譯后永久有效,用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。存儲過程是數(shù)據(jù)庫中的一個重要對象购公。在數(shù)據(jù)量特別龐大的情況下利用存儲過程能達(dá)到倍速的效率提升。
// 具體例子
DELIMITER //
DROP PROCEDURE IF EXISTS demo;
CREATE PROCEDURE demo()
? ? BEGIN
? ? DECLARE n int DEFAULT 0;
? ? ? ? WHILE(n<20000) DO
? ? ? ? ? ? INSERT INTO t_user(name) VALUES(substring(MD5(RAND()),floor(RAND()*26)+1,6));
? ? ? ? set n = n + 1;
? ? ? ? END WHILE ;
? ?END //
DELIMITER ;
call demo();
DELIMITER;
DROP PROCEDURE IF EXISTS demo;
CREATE PROCEDURE demo()
? ? BEGIN
? ? DECLARE n int DEFAULT 0;
? ? ? ? WHILE(n<3) DO
? ? ? ? ? ? INSERT INTO liuyan(liuyan) VALUES(substring(MD5(RAND()),floor(RAND()*26)+1,6));
? ? ? ? set n = n + 1;
? ? ? ? END WHILE ;
? ?END;
DELIMITER ;
call demo();
上面是在查詢中執(zhí)行的語句,語句中新建了一個存儲過程demo陌知,并且說如果demo已經(jīng)存在就刪除調(diào)(如果已有demo,會刪除掖肋,并重新創(chuàng)建仆葡。如果沒有demo,就新建一個存儲過程demo)
下面是新建函數(shù)志笼,是一個存儲過程沿盅,可以保存為demo把篓,存儲過程的名稱為demo,存儲過程demo可以在ssm框架中調(diào)用腰涧。
BEGIN
? ? DECLARE n int DEFAULT 0;
? ? ? ? WHILE(n<200) DO
? ? ? ? ? ? INSERT INTO user(userId,userName) VALUES(500 + RAND() * (1000 - 500),substring(MD5(RAND()),floor(RAND()*26)+1,6));
? ? ? ? set n = n + 1;
? ? ? ? END WHILE ;
? END
ssm調(diào)用存儲過程時韧掩,存儲過程支持事務(wù)。
分隔符
MySQL默認(rèn)以";"為分隔符窖铡,如果沒有聲明分割符疗锐,則編譯器會把存儲過程當(dāng)成SQL語句進(jìn)行處理,因此編譯過程會報錯万伤,所以要事先用“DELIMITER //”聲明當(dāng)前段分隔符窒悔,讓編譯器把兩個"http://"之間的內(nèi)容當(dāng)做存儲過程的代碼,不會執(zhí)行這些代碼敌买;“DELIMITER ;”的意為把分隔符還原简珠。
參數(shù)
存儲過程根據(jù)需要可能會有輸入、輸出虹钮、輸入輸出參數(shù)聋庵,如果有多個參數(shù)用","分割開。MySQL存儲過程的參數(shù)用在存儲過程的定義芙粱,共有三種參數(shù)類型,IN,OUT,INOUT:
IN參數(shù)的值必須在調(diào)用存儲過程時指定祭玉,在存儲過程中修改該參數(shù)的值不能被返回,為默認(rèn)值
OUT:該值可在存儲過程內(nèi)部被改變春畔,并可返回
INOUT:調(diào)用時指定脱货,并且可被改變和返回
DELIMITER //
? CREATE PROCEDURE out_param(OUT p_out int)
? ? BEGIN
? ? ? SELECT p_out;
? ? ? SET p_out=2;
? ? ? SELECT p_out;
? ? END;
? ? //
DELIMITER ;
#調(diào)用
SET @p_out=1;
CALL out_param(@p_out);
SELECT @p_out;
IN a int // 調(diào)用時,a可以賦值律姨,但不能返回
OUT a int // 調(diào)用時振峻,a無法賦值,但可以返回
INOUT a int // 調(diào)用時择份,a可以賦值扣孟,也可以返回
一、if - then - else語句
二荣赶、while循環(huán)語句