存储过程--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;
总结:
存储过程一般都是实现复杂一些的功能
存储过程一般独立来执行。
存储过程常常针对表操作。
根据需要定制存储过程。
存储过程--mysql的更多相关文章
- 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 ...
- 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 ...
- 触发器 视图 存储过程 mysql常用函数
...
- 到底该不该使用存储过程 MySQL查询性能优化一则
到底该不该使用存储过程 看到<阿里巴巴java编码规范>有这样一条 关于这条规范,我说说我个人的看法 用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术牛逼,就视 ...
- java调用存储过程mysql
在java中调用带返回值的存储过程的实现 直接上代码: DELIMITER $$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `t ...
- 订单支付成功后存储过程 - MYSQL
BEGIN SET @userId = (SELECT user_id FROM t_shoporder WHERE id = orderId); /*修改订单状态,改成已支付*/ ,update_t ...
- 下订单存储过程 - MYSQL
BEGIN DECLARE smark INT; DECLARE orderId INT; /*查询课程是否存在,如果不存在就不执行订单操作了*/ ) FROM t_course WHERE id = ...
- MySQL主从环境下存储过程,函数,触发器,事件的复制情况
下面,主要是验证在MySQL主从复制环境下,存储过程,函数,触发器,事件的复制情况,这些确实会让人混淆. 首先,创建一张测试表 mysql),age int); Query OK, rows affe ...
- 我的MYSQL学习心得(十) 自定义存储过程和函数
我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...
随机推荐
- Struts2接受请求参数三种常用方法
一 接受请求参数主要有三种:属性驱动 对象驱动 模型驱动<model Driven> 方式1:在Action中接收请求参数不需要使用request对象,在Action中定义与请求参数相同名 ...
- <每日一题>题目28:生成随机的测验试卷(单选题)
#项目:生成随机的测验试卷文件 import random #资料库 capitals = {'北京市':'京','上海市':'沪','天津市':'津','重庆市':'渝','河北省':'冀','山西 ...
- HDU--2191 汶川地震购米(多重背包)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2191 分析:有资金n元,而市场有m种大米,每种大米价格不等,重量不等,数量不等, 并且只能整袋购买.如何用 ...
- js如何往数组Array中添加元素 (2013-09-04 10
unshift:将参数添加到原数组开头,并返回数组的长度 pop:删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined push:将参数添加到原数组末尾,并返回数组的长度 co ...
- Leetcode938. Range Sum of BST二叉搜索树的范围和
给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和. 二叉搜索树保证具有唯一的值. 示例 1: 输入:root = [10,5,15,3,7,null,18], L = 7 ...
- Ionic JPush极光推送二
1.看图解决问题 2.解决出现统计代码提示问题 修改这个java 文件 导入命名空间 import cn.jpush.android.api.JPushInterface; 添加方法 @Overr ...
- 原生微信小程序数据渲染
一直在写vue,第一次接触微信小程序,还是原生,最开始做的时候真的很闹心啊啊啊啊啊啊啊啊啊啊啊啊!!所以最近大概更新的都是微信小程序原生的内容了~~么么哒!!一定会继续努力的!!tips:在小程序项目 ...
- OpenCV cvReleaseImage把图像怎么样了?
cvReleaseImage(img)和free.delete相同,只是把该指针img所指的内存给释放掉,但并没有把img指针本身干掉,其地址仍然不变(非NULL),只是该地址对应的内存是垃 ...
- Leetcode98. Validate Binary Search Tree验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右子树自身必须也是二叉搜索 ...
- 用Python的requests库作接口测试——上传文件
POST一个多部分编码(Multipart-Encoded)的文件 Requests使得上传多部分编码文件变得很简单: >>> url = 'http://httpbin.org/p ...