存儲過程
1、存儲過程:
存儲過程保存在mysql.proc表中
2、創建存儲過程:
CREATE PROCEDURE sp_name ([ proc_parameter [,proc_parameter ...]])
routime_body
其中:proc_parameter : [IN|OUT|INOUT] parameter_name type
其中IN表示輸入參數,OUT表示輸出參數,INOUT表示既可以輸入也可以輸出;param_name表示參數名稱;type表示參數的類型
3、查看存儲過程列表:
SHOW PROCEDURE STATUS
4、查看存儲過程定義
SHOW CREATE PROCEDURE sp_name
5、調用存儲過程
CALL sp_name ([ proc_parameter [,proc_parameter ...]])
CALL sp_name
說明:當無參時,可以省略"()",當有參數時,不可省略"()”
6、存儲過程修改
ALTER語句修改存儲過程只能修改存儲過程的註釋等無關緊要的東西,不能修改存儲過程體,所以要修改存儲過程,方法就是刪除重建
7、刪除存儲過程
DROP PROCEDURE [IF EXISTS] sp_name
8、存儲過程優勢
存儲過程把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,當需要時從數據庫中直接調用,省去了編譯的過程
提高了運行速度
同時降低網絡數據傳輸量
存儲過程相當於獨立命令可以直接調用
9、存儲過程與自定義函數的區別
存儲過程實現的過程要複雜一些,而函數的針對性較強
存儲過程可以有多個返回值,而自定義函數只有一個返回值
存儲過程一般獨立的來執行,而函數往往是作爲其他SQL語句的一部分來使用
存儲過程示例:
MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> CREATE PROCEDURE showTime()
-> BEGIN
-> SELECT now();
-> END//
delimiter ;
Query OK, 0 rows affected (0.02 sec)
MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> CALL showTime;
+---------------------+
| now() |
+---------------------+
| 2018-10-09 19:38:46 |
+---------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
查看存儲過程:
MariaDB [hellodb]> show procedure status\G
*************************** 1. row ***************************
Db: hellodb
Name: showTime
Type: PROCEDURE
Definer: root@localhost
Modified: 2018-10-09 19:38:45
Created: 2018-10-09 19:38:45
Security_type: DEFINER
Comment:
character_set_client: utf8
collation_connection: utf8_general_ci
Database Collation: utf8_general_ci
1 rows in set (0.00 sec)
跨數據庫是否能執行:
1、MariaDB [hellodb]> use db1
2、MariaDB [db1]> CALL showTime;
ERROR 1305 (42000): PROCEDURE db1.showTime does not exist
3、MariaDB [db1]> call hellodb.showTime;
+---------------------+
| now() |
+---------------------+
| 2018-10-09 19:43:15 |
+---------------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)
創建含參存儲過程:只有一個IN參數
MariaDB [db1]> delimiter ;
MariaDB [db1]> call selectById(2);
ERROR 1054 (42S22): Unknown column 'stuid' in 'where clause'
MariaDB [db1]> call selectById(3);
ERROR 1054 (42S22): Unknown column 'stuid' in 'where clause'
MariaDB [db1]> use hellodb
Database changed
MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> CREATE PROCEDURE selectById(IN uid SMALLINT UNSIGNED)
-> BEGIN
-> SELECT * FROM students WHERE stuid = uid;
-> END//
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> call selectById(2);
+-------+------------+-----+--------+---------+-----------+
| StuID | Name | Age | Gender | ClassID | TeacherID |
+-------+------------+-----+--------+---------+-----------+
| 2 | Shi Potian | 22 | M | 1 | 7 |
+-------+------------+-----+--------+---------+-----------+
1 row in set (0.02 sec)
Query OK, 0 rows affected (0.02 sec)
計算的存儲過程示例:
# @i 變量
# repeat 重複
# @i = @i + 1 相當於shell腳本里面的i++
MariaDB [hellodb]> delimiter //
MariaDB [hellodb]> CREATE PROCEDURE dorepeat(n INT)
-> BEGIN
-> SET @i = 0;
-> SET @sum = 0;
-> REPEAT SET @sum = @sum+@i; SET @i = @i + 1;
-> UNTIL @i > n END REPEAT;
-> END//
delimiter ;
Query OK, 0 rows affected (0.02 sec)
MariaDB [hellodb]> delimiter ;
MariaDB [hellodb]> CALL dorepeat(100);
Query OK, 0 rows affected (0.00 sec)
MariaDB [hellodb]> SELECT @sum;
+------+
| @sum |
+------+
| 5050 |
+------+
1 row in set (0.00 sec)
流程控制
存儲過程和函數中可以使用流程控制來控制語句的執行
流程控制:
IF:用來進行條件判斷。根據是否滿足條件,執行不同語句
CASE:用來進行條件判斷,可實現比IF語句更復雜的條件判斷
LOOP:重複執行特定的語句,實現一個簡單的循環
LEAVE:用於跳出循環控制
ITERATE:跳出本次循環,然後直接進入下一次循環
REPEAT:有條件控制的循環語句。當滿足特定條件時,就會跳出循環語句
WHILE:有條件控制的循環語句