MySQL-存儲過程

存儲過程

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:有條件控制的循環語句
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章