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;

总结:

存储过程一般都是实现复杂一些的功能
存储过程一般独立来执行。
存储过程常常针对表操作。
根据需要定制存储过程。
 
 
 
 
 

存储过程--mysql的更多相关文章

  1. mybatis/callablestatement调用存储过程mysql connector产生不必要的元数据查询

    INFO | jvm 1 | 2016/08/25 15:17:01 | 16-08-25 15:17:01 DEBUG pool-1-thread-371dao.ITaskDao.callProce ...

  2. mysql jdbc性能优化之mybatis/callablestatement调用存储过程mysql jdbc产生不必要的元数据查询(已解决,cpu负载减少20%)

    INFO | jvm 1 | 2016/08/25 15:17:01 | 16-08-25 15:17:01 DEBUG pool-1-thread-371dao.ITaskDao.callProce ...

  3. 触发器 视图 存储过程 mysql常用函数

                                                                                                        ...

  4. 到底该不该使用存储过程 MySQL查询性能优化一则

    到底该不该使用存储过程   看到<阿里巴巴java编码规范>有这样一条 关于这条规范,我说说我个人的看法 用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术牛逼,就视 ...

  5. java调用存储过程mysql

    在java中调用带返回值的存储过程的实现 直接上代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `t ...

  6. 订单支付成功后存储过程 - MYSQL

    BEGIN SET @userId = (SELECT user_id FROM t_shoporder WHERE id = orderId); /*修改订单状态,改成已支付*/ ,update_t ...

  7. 下订单存储过程 - MYSQL

    BEGIN DECLARE smark INT; DECLARE orderId INT; /*查询课程是否存在,如果不存在就不执行订单操作了*/ ) FROM t_course WHERE id = ...

  8. MySQL主从环境下存储过程,函数,触发器,事件的复制情况

    下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...

  9. 我的MYSQL学习心得(十) 自定义存储过程和函数

    我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...

随机推荐

  1. Struts2接受请求参数三种常用方法

    一 接受请求参数主要有三种:属性驱动 对象驱动 模型驱动<model Driven> 方式1:在Action中接收请求参数不需要使用request对象,在Action中定义与请求参数相同名 ...

  2. <每日一题>题目28:生成随机的测验试卷(单选题)

    #项目:生成随机的测验试卷文件 import random #资料库 capitals = {'北京市':'京','上海市':'沪','天津市':'津','重庆市':'渝','河北省':'冀','山西 ...

  3. HDU--2191 汶川地震购米(多重背包)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2191 分析:有资金n元,而市场有m种大米,每种大米价格不等,重量不等,数量不等, 并且只能整袋购买.如何用 ...

  4. js如何往数组Array中添加元素 (2013-09-04 10

    unshift:将参数添加到原数组开头,并返回数组的长度 pop:删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined push:将参数添加到原数组末尾,并返回数组的长度 co ...

  5. Leetcode938. Range Sum of BST二叉搜索树的范围和

    给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜索树保证具有唯一的值. 示例 1: 输入:root = [10,5,15,3,7,null,18], L = 7 ...

  6. Ionic JPush极光推送二

    1.看图解决问题   2.解决出现统计代码提示问题 修改这个java 文件 导入命名空间 import cn.jpush.android.api.JPushInterface; 添加方法 @Overr ...

  7. 原生微信小程序数据渲染

    一直在写vue,第一次接触微信小程序,还是原生,最开始做的时候真的很闹心啊啊啊啊啊啊啊啊啊啊啊啊!!所以最近大概更新的都是微信小程序原生的内容了~~么么哒!!一定会继续努力的!!tips:在小程序项目 ...

  8. OpenCV cvReleaseImage把图像怎么样了?

         cvReleaseImage(img)和free.delete相同,只是把该指针img所指的内存给释放掉,但并没有把img指针本身干掉,其地址仍然不变(非NULL),只是该地址对应的内存是垃 ...

  9. Leetcode98. Validate Binary Search Tree验证二叉搜索树

    给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...

  10. 用Python的requests库作接口测试——上传文件

    POST一个多部分编码(Multipart-Encoded)的文件 Requests使得上传多部分编码文件变得很简单: >>> url = 'http://httpbin.org/p ...