1. 存储过程:对sql的封装和重用,经编译创建并保存在数据库中,通过指定存储过程的名字并给定参数(需要时)来调用执行。

  2. 优缺点:

    (1) 优点:

    • 执行速度快------存储过程只在创建时进行编译,以后每次执行存储过程都不需要重新编译,而一般SQL语句没执行一次就需编译一次,所以使用存储过程可提高数据库的执行速度;
    • 减少网络通信量------当对数据库进行复杂操作时,(如对多个表进行insert、update、select、delete时)可将这些复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用。这些操作,如果用程序完成就是多条SQL语句,可能要多次连接数据库,而换成存储过程只需一次连接。
    • 更强的适应性与复用性------存储过程可以重复使用,提高了可重用性,减少数据库开发人员的工作量。

    • 可维护性高------更新存储过程通常比更改、测试以及重新部署程序集需要较少的时间和精力。

    • 安全性高,可设定只有某用户才能对指定存储过程的使用权,且存储过程比多条sql稳定,只要数据库不出现问题,基本上是不会出现什么问题的,同时可以防止 SQL注入。

    (2) 缺点:

    • 开发调试差:无良好的IDE开发工具,存储过程的调试比一般SQL要复杂的多。

    • 可移植性差:由于存储过程将应用程序绑定到数据库上,因此使用存储过程封装业务逻辑将限制应用程序的可移植性,如果应用程序进行数据源的切换(Mysql-->Orcle),需重新编写存储过程。

    • 不支持群集:数据库服务器无法水平扩展,或者数据库的切割(水平或垂直切割)。数据库切割之后,存储过程并不清楚数据存储在哪个数据库中。
  3. 存储过程的创建:

    • create procedure 存储过程名 ([参数列表])  begin   sql 语句  end;

      • 参数列表的格式:[类型限定 变量名 数据类型] (5.7的发现参数数据类型长度必须声明,不然sql编译不过)

        • 参数列表有自己的类型限定,这个类型限定与数据类型不同,它是限定参数的作用范围

          • in:限定这个参数是传值给存储过程,既然是传值,所以可以是变量或常量数据【in修饰的参数一般是传入存储过程中作为某些条件的,不会被存储过程修改
          • out:限定这个参数是存储过程传出的一个值,因为有值的返回,所以这个参数必须是一个变量【存储过程中会给out修饰的变量赋值,使得过程外部可以获取这个更改的值】
          • inout:inout是上面两者的叠加,既可以被存储过程内部使用,又可以修改后被外部使用,因为有值的返回,所以这个参数必须是一个变量
    • 理论上,对于希望简洁代码的地方都可以使用存储过程来处理,比如希望快速使用多条select,又比如希望从数据中取出多个值赋值给变量;所以下面只给出用法,应用场景就不讲述了。
      • 1:不传入参数,只执行某些特定代码
      • 2.传入参数,并利用参数作为条件执行代码
      • 3.传入参数,并利用参数作为条件执行代码,同时利用变量获取结果。
  4. 存储过程的使用:

    • 调用存储过程:call 存储过程名();
    • 带参数的调用存储过程:call 存储过程名(参数);
    • 对于in类型的,参数可以是数值,可以是变量
      • 对于out\inout类型的,参数必须是变量
      • 所有MySQL变量都必须以 @ 开始
      • 示例:call myselect("lilei",@变量名);示例:call myselect(@变量名,@变量名)
  5. 实例:

-- 无参创建
CREATE PROCEDURE demo1()
BEGIN
SELECT * from cli_txinfo LIMIT 1;
end;
-- 调用,输出查询结果
call demo1(); -- 2.有参创建,格式为:in 参数名 类型(长度)....
-- 单参demo2(in tableName varchar(20))
-- 多参demo2(in tableName varchar(20),name varchar(40))
create procedure demo2(in tableName varchar(20),name varchar(40))
BEGIN
SELECT * from cli_txinfo where txname = name LIMIT 1;
end;
-- 调用,输出查询结果
call demo2("abc001","专属顾问绑定申请列表查询"); --3.有参创建,值返回格式为:out 参数名 类型(长度)
create procedure demo3(in tx varchar(20),out otx varchar(20))
begin
SELECT txname from cli_txinfo where txcode = tx into otx;
end;
-- 调用,输出结果存储到@tx中,只显示sql的执行情况,没有输出操作结果,变量命名必须以@开头
-- call demo3("abd002",tx); ---->>编译错误
call demo3("abd002",@tx);
-- 变量传参,格式为 set @变量名 = 值
-- set @a = "abd002";
-- call demo3(@a,@tx);
-- 查询输出结果变量名的值
SELECT @tx; -- 存储过程的复杂sql语句
create procedure demo4()
begin
SELECT * from cli_txinfo limit 1;
select * from cli_role limit 1;
END;
demo
call demo4; -- 动态传入表名(案例以两个数据库进行表的同步)
-- 使用CONCAT进行sql的拼接,拼接处必须留有空格,比如 concat('insert into '),不然拼接无法识别参数
-- prepare预处理,execute 执行,DEALLOCATE PREPARE释放资源
create procedure demo5(in syncTable varchar(20))
BEGIN
set @deleteSql = CONCAT('truncate table keyun.',syncTable);
set @insertSql = CONCAT('insert into keyun.',syncTable,' SELECT distinct * ','from keyun_sync.',syncTable);
prepare delstmt from @deleteSql;
prepare insstmt from @insertSql;
execute delstmt;
execute insstmt;
DEALLOCATE PREPARE delstmt;
DEALLOCATE PREPARE insstmt;
end;
-- 调用,输出查询结果
call demo5("third_binding");

  6.查看存储过程:

    • 查看存储过程的创建语句:show create procedure 存储过程名;
    • 查看存储过程状态:show procedure status;【显示的内容包括创建时间、注释、定义的用户、安全类型等等】

7.修改存储过程:

    • 修改存储过程只能修改那些选项,并不能修改传入传出参数或者sql语句。
    • alter procedure 存储过程名 选项;

8.删除存储过程:

    • 语法:drop procedure 存储过程名;
    • 示例:
      • drop procedure demo1;

  9.MyBatis实战使用:

        //=========Service业务层==============
Map<String, Object> param = new HashMap<String, Object>();
param.put("YPID", ypId);
factory.yearPlanMapper.updArrAndLeav(param);
Date arriveTime = (Date) param.get("arrive_time");
Date leaveTime = (Date) param.get("leave_time");
//=========Dao数据层================
void updArrAndLeav(Map<String, Object> param);
//=====MyBatis的xml:in参数,out返回值======
<select id="updArrAndLeav" statementType="CALLABLE">
{call
usp_update_year_date_formal(
#{YPID,mode=IN,jdbcType=NVARCHAR},
#{arrive_time,mode=OUT,jdbcType=DATE},
#{leave_time,mode=OUT,jdbcType=DATE}
)}
</select>

Mysql 5.7存储过程的学习的更多相关文章

  1. mysql 5.0存储过程学习总结

    mysql存储过程的创建,删除,调用及其他常用命令 本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.q ...

  2. mysql的分页存储过程,能够传出总记录数

    最近用mysql + asp.net来写网站,既然mysql已经支持存储过程了,那么像分页这么常用的东西,当然要用存储过程啦 不过在网上找了一些,发现都有一个特点——就是不能传出总记录数,干脆自己研究 ...

  3. MySQL中的联合索引学习教程

    MySQL中的联合索引学习教程 这篇文章主要介绍了MySQL中的联合索引学习教程,其中谈到了联合索引对排序的优化等知识点,需要的朋友可以参考下   联合索引又叫复合索引.对于复合索引:Mysql从左到 ...

  4. 关于mysql触发器和存储过程的理解

    内容源自:一篇很棒的 MySQL 触发器学习教程 一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊 ...

  5. 2020重新出发,MySql基础,MySql视图&索引&存储过程&触发器

    @ 目录 视图是什么 视图的优点 1) 定制用户数据,聚焦特定的数据 2) 简化数据操作 3) 提高数据的安全性 4) 共享所需数据 5) 更改数据格式 6) 重用 SQL 语句 MySQL创建视图 ...

  6. MySQL函数及存储过程

    MySQL函数及存储过程 参考文章:https://www.cnblogs.com/wupeiqi/articles/5713323.html 1.函数 1.1内置函数 官方文档:https://de ...

  7. MySql通用分页存储过程

    MySql通用分页存储过程 1MySql通用分页存储过程 2 3过程参数 4p_cloumns varchar(500),p_tables varchar(100),p_where varchar(4 ...

  8. mysql 中创建存储过程

    mysql中创建存储过程和存储函数虽相对其他的sql语言相对复杂,但却功能强大,存储过程和存储函数更像是一种sql语句中特定功能的一种封装,这种封装可以大大简化外围调用语句的复杂程度. 首先以表emp ...

  9. mysql 自己定义存储过程和触发器

    mysql 自己定义存储过程和触发器 --存储过程示范 DROP PROCEDURE IF EXISTS PRO_TEST; CREATE PROCEDURE PRO_TEST(IN NUM_IN I ...

随机推荐

  1. CodeForces-939A

    链接: https://vjudge.net/problem/CodeForces-939A 题意: As you could know there are no male planes nor fe ...

  2. 购物网站被p.egou.com强制恶意劫持

    今天早上打开电脑浏览京东,发现随便点击商品,都自动转化为淘客推广的页面, 我以为是360浏览器自己干的,然后我换了谷歌,也是一样,难道这是电脑里面有流氓插件? 我又换了火狐,还是一样,没办法了,换IE ...

  3. 树莓派Zero W无键盘无屏幕初始化

    买了个树莓派Zero W,结果发现没mini hdmi线 淘宝了一根mini hdmi,等了5天,拿到手后发现zero还没地接键盘,这下脑袋大了 查了下资料,发现树莓的系统,可以这boot分区中加入一 ...

  4. NOIP2015普及组总结

    NOIP2015普及组总结 这次考试总体感觉不错,不过觉得时间有点紧,在最后30分钟才打完. 第一题(金币coin):大大的W!爆搜O(N),一分钟打完: 第二题(扫雷游戏mine):同上: 第三题( ...

  5. vue-cli3.0的配置

    转自 https://www.cnblogs.com/sangzs/p/9543242.html module.exports = { // 基本路径 baseUrl: '/', // 输出文件目录 ...

  6. js中[]、{}、()区别

    一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函数体 {}表示对象.[]表示对象的属性.方法,()如果用在方法名后面,代表调用 如:var LangShen = {&quo ...

  7. Power-Aware GateSim Debug

    For PAG debug, the following steps may be useful. 1. Get correct netlists from PD which contain powe ...

  8. CDOJ 1146 A - 秋实大哥与连锁快餐店 最小生成树 Prim算法 稠密图

    题目链接 A - 秋实大哥与连锁快餐店 Time Limit:3000MS     Memory Limit:65535KB     64bit IO Format:%lld & %llu S ...

  9. 【学习小记】Berlekamp-Massey算法

    Preface BM算法是用来求一个数列的最短线性递推式的. 形式化的,BM算法能够对于长度为n的有穷数列或者已知其满足线性递推的无穷数列\(a\),找到最短的长度为m的有穷数列\(c\),满足对于所 ...

  10. CCA(典型相关分析)

    https://www.cnblogs.com/pinard/p/6288716.html