存儲過程 存儲過程就是具有名字的一段代碼,用來完成一個特定的功能 — SET 和 DECLARE 定義變量的區別: CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test`() 這裏寫個註解,可以增強代碼可讀性: BEGIN -- 開始 -- declare定義的變量爲局部變量,僅在方法中生效。即只在存儲過程中的begin和end之間生效。 -- @set定義的類似全局變量 DECLARE b INT DEFAULT 1; SET @a = @a + 1; SET b = b + 1; SELECT @a,b; END -- 結束 mysql> set @a = 1; Query OK, 0 rows affected (0.00 sec) mysql> call p_test(); +------+------+ | @a | b | +------+------+ | 2 | 2 | +------+------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> call p_test(); +------+------+ | @a | b | +------+------+ | 3 | 2 | +------+------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) — 可以看到a一直增加,b一直沒變; — IN OUT INOUT 參數區別: — IN e.g1 CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test2`(IN a INT) 測試IN: BEGIN SELECT a; END mysql> call p_test2(1); +------+ | a | +------+ | 1 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) — IN e.g2 CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test2`(IN a INT) 測試IN: BEGIN SET a = a + 1; SELECT a; END mysql> set @a =3; Query OK, 0 rows affected (0.00 sec) mysql> call p_test2(@a); +------+ | a | +------+ | 4 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> select @a; +------+ | @a | +------+ | 3 | +------+ 1 row in set (0.00 sec) — OUT e.g1 — 注: 傳出值只能是變量,下面的參數a 是傳出值 CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test3`(OUT a INT) 測試OUT: BEGIN SELECT a; SET a = 1; SELECT a; END — call p_test3(123); 會報錯 ERROR 1414 Call p_test(@abc); mysql> call p_test3(@abc); +------+ | a | +------+ | NULL | — 因爲不接收輸入值 +------+ 1 row in set (0.00 sec) +------+ | a | +------+ | 1 | +------+ 1 row in set (0.00 sec) mysql> select @abc; -- 打印出上面的存儲過程的傳出值(變量@abc) +------+ | @abc | +------+ | 1 | +------+ 1 row in set (0.00 sec) — INOUT e.g1 輸入輸出值也必須爲變量 mysql> set @abc = 10; Query OK, 0 rows affected (0.00 sec) mysql> call p_test4(@abc); +------+ | a | +------+ | 10 | +------+ 1 row in set (0.00 sec) +------+ | a | +------+ | 11 | +------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> select @abc; +------+ | @abc | +------+ | 11 | +------+ 1 row in set (0.00 sec) — 可以看到 輸入變量值@abc 10 最後經過存儲過程改變成了輸出變量@abc 11,即改變了變量; — 條件循環語句 — if then else end if 語句 CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test5`(IN a INT) 測試條件和循環語句: BEGIN if a > 10 then SELECT 'a大於10'; else SELECT 'a小於10'; end if; END mysql> call p_test5(100); +-----------+ | a大於10 | — 列頭 +-----------+ | a大於10 | +-----------+ 1 row in set (0.00 sec) — case when then end case 語句 mysql> call p_test6(10); +----------------+ | 你輸入了10 | +----------------+ | 你輸入了10 | +----------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> call p_test6(11); +----------------+ | 你輸入了11 | +----------------+ | 你輸入了11 | +----------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> call p_test6(12); +---------------------------------+ | 你輸入了10、11之外的數 | +---------------------------------+ | 你輸入了10、11之外的數 | +---------------------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) — while do end while 循環 CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test7`(IN a INT) 測試條件和循環語句: BEGIN while a < 3 do SELECT concat('我循環了', a,'次'); SET a=a + 1; end while; END mysql> call p_test7(1); +---------------------------------+ | concat('我循環了', a,'次') | +---------------------------------+ | 我循環了1次 | +---------------------------------+ 1 row in set (0.00 sec) +---------------------------------+ | concat('我循環了', a,'次') | +---------------------------------+ | 我循環了2次 | +---------------------------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) — repeat end repeat 執行操作後檢查結果,while 則是執行前進行檢查 CREATE DEFINER=`root`@`localhost` PROCEDURE `p_test8`(IN a INT) 測試條件和循環語句: BEGIN repeat SELECT '我循環了'; SET a = a + 1; until a > 3 end repeat; END mysql> call p_test8(1); +--------------+ | 我循環了 | +--------------+ | 我循環了 | +--------------+ 1 row in set (0.00 sec) +--------------+ | 我循環了 | +--------------+ | 我循環了 | +--------------+ 1 row in set (0.00 sec) +--------------+ | 我循環了 | +--------------+ | 我循環了 | +--------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) — 其他 mysql> select 100 into @abc; Query OK, 1 row affected (0.00 sec) mysql> select @abc; +------+ | @abc | +------+ | 100 | +------+ 1 row in set (0.00 sec)