存储过程--mysql

https://zhuanlan.zhihu.com/p/23423264

存储过程-官方解释:

是sql语句和控制语句的预编译集合。以一个名称存储并作为一个单元处理。

存储过程-直白的说:

把需要的命令预编译好。存到数据库。只在第一次的时候需要编译,存储后,以后使用的时候客户端直接(传参)调用。各种省事。

优点:

增强sql语句的功能性和灵活性
实现较快的执行速度
减少网络流量【因为往数据库传递的参数少了。所以请求少了】

怎么使用:

A、首先需要DELIMITER 语句来修改定界符
B、然后创建存储过程【CREATE PROCUDURE】过程体中可以用 in 和 out 传参。
C、通过CALL来调用
为什么使用DELITIMITER 修改定界符?
mysql默认以分号作为sql语句的结束来进行执行,当我们在创建存储过程时,为
了不让完整的存储过程语句由于分号而提前执行,需要临时规定以//或者$$来作
为结束符号。这样的话,创建存储过程时,中间的分号会被忽略,直到遇到//符
号才执行语句。

注意:

A、因为存储过程的 过程体不可修改,所以设置错误后,一般都是删除后,重新创建。
B、设置的参数,不要和表中的字段名字相同。
DROP PROCEDURE 名字;  删除命令

举例:【带有一个参数的存储过程 IN】

@var int   p_id 关联id
delimiter // 重新定义定界符
create procedure  removeUserId(IN p_id  INT  UNSIGNED)
BEGIN
DELETE FROM users where id = p_id;
END
//
delitimer ;  这里是把定界符在修改回来
CALL removeUserId(3); 调用

举例:【带有IN 和 OUT类型参数的存储过程】
@var int   p_id 关联id
@var int  userNums 删除后剩下的条数
DELITIMER //
CRTEATE PROCEDURE removeAndReturnUserNums(IN p_id INT UNSIGNED,OUT userNums INT UNSIGNED) 这里设置了两个参数
BEGIN
DELETE FROM users WHERE id = p_id;
SELECT COUNT(id) FROM USERS INTO userNums;
END
//
DELITIMER ;

CALL removeAndRrturnUserNums(27,@nums)  //这里的@ 是用户变量。下面是总结
注意:
mysql变量的术语分类:
A.用户变量:以"@"开始,形式为"@变量名"
用户变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效
B、全局变量:定义时,以如下两种形式出现,set GLOBAL 变量名  或者  set @@global.变量名 
对所有客户端生效。只有具有super权限才可以设置全局变量


认识一个系统函数:row_count()

row_count();  得到操作行数。(单独用没用)
例子:插入数据
INSERT test(username) VALUES('A'),('B'),('C'); 
SELECT ROW_COUNT(); //返回被插入的记录总数 结果为3

举例:【带有多个 OUT类型参数的存储过程】

@var SMALLINT p_age 关联p_age
@var SMALLINT deleteUsers 删除总条数
@var SMALLINT  userCounts 剩余总条数
DELIMITER //
CREATE PROCEDURE rmUserByAgeAndRtInfos(IN p_age SMALLINT UNSIGNED, OUT deleteUsers SMALLINT UNSIGNED, OUT userCounts SMALLINT UNSIGNED)
BEGIN
DELETE FROM users WHERE WHERE age = p_age; //删除条件
SELECT ROW_COUNT() INTO deleteUsers;	//返回刚删的记录
SELECT COUNT(id) from users INTO userCounts;	//得到剩余的ID数
END
//
DELIMITER ;
CALL rmUserByAgeAndRtInfos(23, @a, @b);
SELECT @a, @b;

总结:

存储过程一般都是实现复杂一些的功能
存储过程一般独立来执行。
存储过程常常针对表操作。
根据需要定制存储过程。
 
 
 
 
 
posted @ 2018-02-26 13:46  奔跑中的兔子  阅读(169)  评论(0编辑  收藏  举报