上次分享MySQL中介绍了自定义函数,今天分享一个叫做存储过程的东东。

MySQL是这样执行命令的:

如果我们省略掉分析和编译的过程那么可以节省很多时间和过程。

存储过程:是SQL语句和控制语句的预编译集合,以一个名称存储并作为一个单元来处理。

存储过程存储在过程之内,可以由应用程序调用执行,允许用户声明变量,以及流程控制;存储过程可以接受参数,也可以接受输出类型的参数;并且可以存在多个返回值。

创建存储过程的语法:

CREATE[DEFINER = { user | CURRENT-USER }]PROCEDURE sp_name ([proc_parameter[,...]]) [characteristic ...] routine_bodyproc_parameter:[IN | OUT I INOUT ] param_name type

【解释】:IN:表示该参数值必须在调用存储过程时指定;(只进不出)

OUT:表示该参数值可以被存储过程改变并且可以返回。(可出不进)

INOUT:表示该参数的调用时指定,并且可以被改变和返回。

过程体:合法的SQL语句;可以时任意的增删改查链接的SQL语句;如果有复合结构则使用BEGIN...END 语句;复合结构中可以声明,循环和调用。

调用存储过程:

CALL sp_name([parameter[,...]])  或者

CALL sp_name[()]

【解释】如果没有参数那么用哪个调用都可以,但是如果由参数则只能用第一个。

修改存储过程:

ALTER PROCEDURE sp_name[characteristic ... ] COMMENT 'string' |{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA} | SQL SECURITY {DEFINER | INVOKER }

【解释】只能修改、注释当前的内容的类型。

删除存储过程:

DORP PROCEDURE [IF EXISTS] sp_name

【解释】但是在这里只能用删除,而不能修改。

(一)创造一个没有参数的存储过程sp1:

CREATE PROCEDURE sp1() SELECT VERSION();

再调用:CALL sp1;(或者CALL sp1();)

(二)创建一个有输入参数的存储过程sp2:

>DELIMITER//

>CREATE PROCEDURE sp2(IN p_id INT UNSIGNED)

->DELETE FROM users WHERE id = p_id;

->DELIMITER ;

【解释】这里的users 是表名

(三)创建一个既有输入也有输出的参数的存储过程sp3:

>DELIMITER //

>CREATE PROCEDURE sp3(IN p_id  INT UNSIGNED,OUT userNums INT UNSIGNED)

->DELETE FROM users WHERE id = p_id;

->SELECT count(id) FROM users INTO userNums;

->DELIMITER ;

->CALL sp3(27,@nums);

【解释】删除id =27的记录吗,并且返回剩余的记录数为@nums;这个@nums 就是输出的变量

存储过程和自定义函数的区别:存储过程经常用于表的操作,针对性强;存储过程可以有多个返回值,而函数只能有一个;存储过程通常独立完成,而函数作为其他SQL语句的组成部分完成。

在实际过程中很少用函数;对于稍微复杂的经常用到的而且内置没有的,最好封装成存储过程,这样方便每次的调用。

我一直在学MySQL、python、Excel、vba 还有英语口语,讲心里话学的东西很多,还要看一些书籍。大概五个月前,我带着考研失败的抑郁心情走出校门,带着无一技能傍身的焦虑进入社会,带着对未来的憧憬我来到了北京。那时候我下定决心背水一战,面对着很多人包括自己对我的质疑,我开始重头学习Excel,努力学习各种可以傍身的高级技能,我并没有想过五个月后的我会有一个属于自己的公众号,有一份与自己专业相关的工作,但是显然我已经在朝着自己的方向前进着,虽然与自己预期中的高度差得多,但是我依旧可以骄傲的说:我在路上!不管你是否与我经历一样,不管你是否与我相似,我希望遇见同样在路上的你,因为我们都相信有一天会感激在路上的自己!