1. 程式人生 > >[終章]進階20-流程控制結構--if/case/while結構 - 三個while的儲存過程案例(批量生成表單資料) - 隨機長度的隨機字串的儲存過程案例

[終章]進階20-流程控制結構--if/case/while結構 - 三個while的儲存過程案例(批量生成表單資料) - 隨機長度的隨機字串的儲存過程案例

1. mysql 儲存過程中儘量使用 @變數 而不用區域性變數, @變數不容易報錯!許可權小,更改一下就報錯!
2. sql中判斷相等'=' ,用'=' 不用'=='.
3.
#流程控制結構
/*
順序結構: 程式從上往下依次執行;
分支結構: 程式從多條路徑中選擇一條往下執行
迴圈結構: 程式在滿足一定條件的基礎上,重複執行一段程式碼

*/

#一: 分支結構

#if 函式 : 實現簡單的雙分支
/*語法: 實現簡單的雙分支
    if(表示式1,表示式2,表示式3)
    執行順序: 
    如果表示式1成立, 則if函式返回表示式2的值, 否則返回表示式3的值
*/ #2.case 結構 /* 情況1: 類似於java中的switch 語句,一般用於實現等值判斷; 語法: case 變數/表示式/欄位 when 要判斷的值1 then 返回的值1 when 要判斷的值2 then 返回的值2 when 要判斷的值3 then 返回的值3 .... else 要返回的值n end 情況2: 類似於java中的多重IF 語句,一般用於實現區間的判斷 語法: case when 要判斷的條件1 then 返回的值1或者語句1; when 要判斷的條件2 then 返回的值2或者語句2; ... else 要返回的值n或語句n; #可以省略else end case; 特點: 1)可以作為表示式,巢狀在其他語句中使用,可以放在任何地方, begin end 中,或 begin end 的外面 2)可以作為獨立的語句去使用,只能放在begin end中 3)如果when中的某一項值滿足條件或者條件成立,則執行對應的then後面的語句,並且結束case 如果都不滿足,則執行else 語句 4)else可以省略,
*/ #案例: #建立儲存過程,根據傳入的成績,來顯示等級,比如傳入的成績: 90-100,顯示A; 80-90,顯示B;60-80顯示C;否則顯示D; DELIMITER $ CREATE PROCEDURE test_case(IN score INT) BEGIN CASE WHEN score>=90 AND score <=100 THEN SELECT 'A'; WHEN score>=80 THEN SELECT 'B'; WHEN score>=60 THEN SELECT 'C'; ELSE SELECT '
D'; END CASE; END $ CALL test_case(95) $ #A CALL test_case(55) $ #D #3:if 結構, 實現多重分支 /* 語法: if 條件1 then 語句1; elseif 條件2 then 語句2; ... [else 語句n;] end if; 應用場合: 只能在begin /end 中 */ #案例1:根據傳入的成績,來顯示等級,比如傳入的成績: 90-100,返回A; 80-90,返回B;60-80返回C;否則返回D; DELIMITER $ CREATE FUNCTION test_if(score INT) RETURNS NVARCHAR(10) BEGIN IF score>=90 AND score<=100 THEN RETURN 'A'; ELSEIF score>=80 THEN RETURN 'B'; ELSEIF score>=60 THEN RETURN 'C'; ELSE RETURN 'D'; END IF; END $ SELECT test_if(66) $ #C #二: 迴圈結構 /* 分類: while/loop/repeat 迴圈控制: 結束本次迴圈進行下一次: iterate 類似於continue 結束當前所在的迴圈結構 : leave 類似於break IF 條件 THEN LEAVE 標籤名; END IF; */ #1.while ****重點 /*語法: [標籤(名字):]while 迴圈條件 do 迴圈體; end while[標籤名]; */ #2.loop /* 語法: [標籤:]loop 迴圈體; end loop[標籤]; #需要搭配leave跳出死迴圈! #常用來表示模擬單純的死迴圈 */ #3.repeat /* 語法: [標籤名:]repeat 迴圈體; util 結束迴圈的條件; end repeat [標籤]; */ #案例1(簡單while迴圈): 批量插入,根據次數插入到admin 表中的多條記錄 DELIMITER $ CREATE PROCEDURE 批量插入1(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; wa: WHILE i<=insertCount DO INSERT INTO admin(username,`password`) VALUES('Rose'+i,'660'); SET i=i+1; END WHILE wa; END $ CALL 批量插入1(100) $ #案例2(LEAVE(break迴圈的)+while迴圈): 批量插入,根據次數插入到admin 表中的多條記錄,; 如果次數大於20,則停止插入資料 TRUNCATE TABLE admin; DELIMITER $ CREATE PROCEDURE 批量插入2(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 1; wa: WHILE i<=insertCount DO INSERT INTO admin(username,`password`) VALUES(164215000+i,'123456'); IF i>=20 THEN LEAVE wa; END IF; SET i=i+1; END WHILE wa; END $ CALL 批量插入2(100) $ #案例3(iterate(continue)+while迴圈): 批量插入,根據次數插入到admin 表中的多條記錄; 僅僅偶數學號插入. TRUNCATE TABLE admin; DELIMITER $ CREATE PROCEDURE 批量插入5(IN insertCount INT) BEGIN DECLARE i INT DEFAULT 0; wa: WHILE i<=insertCount DO SET i=i+1; IF i%2=1 THEN ITERATE wa; END IF; INSERT INTO admin(username,`password`) VALUES(164215000+i,'123456'); END WHILE wa; END $ CALL 批量插入5(60) $ ############################################### /*案例一:已知表StringContent ,向該表插入指定的個數的隨機長度的隨機字串[1,20] ****隨機模式-先隨機長度,然後再從字母表中取出一個字元加進已有的字串 其中欄位: id 自增長, content varchar(20) */ CREATE TABLE StringContent( id INT PRIMARY KEY AUTO_INCREMENT , content VARCHAR(20) ); DELIMITER $ CREATE PROCEDURE test_randstr_insert4(IN nums INT) BEGIN #select concat('共插入',nums,'條資料'); SET @i = 0; SET @table_str ='abcdefghijklmnopqrstuvwxyz'; a:WHILE @i<nums DO SET @i=@i+1; SET @s2str = ''; SET @len = CEILING(RAND()*15); #代表字元長度 ,共需要迴圈隨機產生len次資料 SET @j = 0; b:WHILE @j<@len+1 DO SET @j=@j+1; SET @s2str = CONCAT(@s2str ,SUBSTR(@table_str,CEILING(RAND()*26),1) ); END WHILE b; INSERT INTO `stringcontent`(id,content) VALUES(@i,@s2str); END WHILE a; END $ CALL test_randstr_insert4(FLOOR(RAND()*100)+1) $ SELECT RAND(); #0.41551091188146816 SELECT FLOOR(RAND()*100); #FLOOR 函式返回小於或等於所給數字表達式的最大整數, 獲取[0,99]之間的數值 SELECT CEILING(RAND() * 100); #CEILING 函式返回大於或等於所給數字表達式的最小整數, 獲取[1,100]之間的數值 SELECT ROUND(RAND() *100); #四捨五入 ,獲取[0,100]之間的數值, 可以出現: 0和100 SELECT ('a'+'b');