SQL存儲過程

存儲過程
存儲過程就是具有名字的一段代碼,用來完成一個特定的功能

— SETDECLARE 定義變量的區別:
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)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章