MySQL/Stored Programs
< MySQL
基础知识:标准SQL的过程化扩展 编辑
分隔符 编辑
MySQL使用一个字符作为SQL语句之间的分隔符。缺省是 ';'。当创建一个存储过程时,过程体内部使用';'分隔了多条语句。这时不希望MySql理解 ';'是CREATE语句的结束标志,这就需要给出其他的分隔符。
例如,指定 '|'为分隔符:
delimiter |
CREATE EVENT myevent
ON SCHEDULE EVERY 1 DAY
DO
BEGIN
TRUNCATE `my_db`.`my_table`;
TRUNCATE `my_db`.`another_table`;
END |
delimiter ;
流程控制 编辑
关键字: IF, CASE, ITERATE, LEAVE LOOP, WHILE, REPEAT
[1].
循环 编辑
WHILE循环 编辑
WHILE循环
[ label: ] WHILE expression DO statements END WHILE [ label ] ;
DELIMITER $$
CREATE PROCEDURE counter()
BEGIN
DECLARE x INT;
SET x = 1;
WHILE x <= 5 DO
SET x = x + 1;
END WHILE;
SELECT x; -- 6
END$$
DELIMITER ;
LOOP循环 编辑
LOOP循环
[ label: ] LOOP statements END LOOP [ label ] ;
DELIMITER $$
CREATE PROCEDURE counter2()
BEGIN
DECLARE x INT;
SET x = 1;
boucle1: LOOP
SET x = x + 1;
IF x > 5 THEN
LEAVE boucle1;
END IF;
END LOOP boucle1;
SELECT x; -- 6
END$$
DELIMITER ;
REPEAT循环 编辑
REPEAT UNTIL循环:
[ label: ] REPEAT statements UNTIL expression END REPEAT [ label ] ;
DELIMITER $$
CREATE PROCEDURE counter3()
BEGIN
DECLARE x INT;
SET x = 1;
REPEAT
SET x = x + 1;
UNTIL x > 5
END REPEAT;
SELECT x; -- 6
END$$
DELIMITER ;
错误处理 编辑
handler声明,对一种错误提出处置[2]:
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
Moreover, the error type can be indicated:
DECLARE CONTINUE HANDLER FOR SQLSTATE [VALUE] sqlstate_value
DECLARE CONTINUE HANDLER FOR SQLWARNING
DECLARE CONTINUE HANDLER FOR NOT FOUND
存储过程 编辑
存储过程是用SQL(以及一些过程式扩展)来编写。使用CALL命令调用存储过程。
存储过程如果返回一个结果,叫做FUNCTION;否则叫做PROCEDURE。
存储过程的优点 编辑
- 降低网络交通:只需要发出一条语句。存储过程里面可能有很多条语句。
- 保持数据库里面的逻辑
- 是可重用的模块
- 可以修改存储过程而不必改变应用程序
- 存储过程的调用者不需要有表的读写权限
- 调用存储过程比执行一条SQL语句更快
管理存储过程 编辑
创建过程 编辑
CREATE DEFINER = `root`@`localhost` PROCEDURE `Module1` ( ) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER OPTIMIZE TABLE wiki1_page;
CALL 编辑
CALL `Module1` ();
删除存储过程 编辑
DROP PROCEDURE `Module1` ;
修改 编辑
DROP PROCEDURE `Module1` ;
CREATE DEFINER = `root`@`localhost` PROCEDURE `Module1` ( ) NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER
BEGIN
OPTIMIZE TABLE wiki1_page;
OPTIMIZE TABLE wiki1_user;
END
元数据 编辑
SHOW FUNCTION / PROCEDURE状态 编辑
SHOW PROCEDURE STATUS;
SHOW CREATE FUNCTION / PROCEDURE 编辑
SHOW CREATE PROCEDURE Module1;
INFORMATION_SCHEMA.ROUTINES 编辑
虚拟数据库INFORMATION_SCHEMA有一张表叫做`ROUTINES`
INFORMATION_SCHEMA.PARAMETERS 编辑
该表包含所有存储函数的值.