当前位置: 首页 > news >正文

存储过程和函数

  存储过程和函数是事先经过编译并存储在数据库中的一段SQL语句的集合,调用存储过程和函数可以简化开发人员的工作量,减少数据在数据库和应用服务器之间的传输,对提高数据处理效率有好处。存储过程和函数的区别在于函数必须有返回值,而存储过程没有;存储过程可以使用IN、OUT和INOUT类型,而函数的参数只能使用IN类型。

创建、修改、删除存储过程或函数

   调用存储过程的语法如下:

  Mysql的存储过程和函数允许提交和回滚,但是不允许执行Load  data infile语句。如下创建存储过程的实例:

  存储过程的调用和直接执行SQL的功能是相同的,但是存储过程的好处是逻辑分装在数据库端,调用者不需要了解其中的逻辑,一旦处理逻辑发生改变,只需要修改存储过程即可。

  下面对characteristic进行说明:

  • LANGUAGE SQL:说明下面过程是使用SQL语言编写,系统默认。
  • [NOT]DETERMINISTIC:DETERMINISTIC确定的,即每次输入一样输出也一样。[NOT]DETERMINISTIC:非确定的。
  • {CONTAINS SQL|NO SQL|READS SQL DATA|MODIFIES SQL DATA}:CONTAINS SQL:表示子程序不包含读写数据的语句;NO SQL:表示子程序不包含SQL语句;READS SQL DATA:表示子程序包含读数据的语句;MODIFIES SQL DATA:表示子程序包含写数据的语句。默认是CONTAINS SQL。
  • SQLSECURITY{DEFINER|INVOKER}:用来指定子程序该使用创建子程序的许可来执行,还是使用调用者的许可来执行。默认是DEFINER。
  • COMMENT 'STIRNG':存储过程或函数的注释。

  删除存储过程和函数的具体语法

 查看存储过程或者函数

  存储过程或者函数创建后,用户可以通过以下方式查看存储过程或者函数的信息。查看存储过程或者函数状态的具体语法如下:

SHOW {PROCEDURE|FUNCTION} STATUS [LIKE 'PATAERN']

  查看存储过程或者函数的定义的语句如下:

SHOW CREATE {PROCEDURE|FUNCTION} SP_NAME

变量的使用

  在存储过程和函数中可以使用变量,并且变量不区分大小写。通过declare可以定义一个局部变量,该局部变量的作用范围只能在begin...END中。变量的定义必须在符合语句的开头,并且在任何其他语句的前面。可以一次申请对个变量,也可以为变量设置DEFAULT默认值。定义变量的语法如下:

DECLARE var_name[,...] type [DEAFULT value]

   变量可以直接赋值,或者通过查询赋值。具体语法如下:

SET var_name=exp [,var_name=exp]...

   也可以通过查询语句给变量赋值,具体语法如下:

SELECT col_name[,...] INTO var_name[,...] table_exp

定义条件和处理

  条件的定义和处理可以用来定义在处理过程中遇到问题时相应的处理步骤。条件的定义如下:

  条件的处理

  通过实例来说明:

   实例2,当对主键异常进行处理时,执行结果如下:

  handler_type目前只支持CONTINUE和EXIT两种,CONTINUE表示继续执行下面的语句,EXIT则表示执行终止。condition_value的值可以是DECLARE定义的condition_name,可以是SQLSRATE的值或者mysql-error-code的值或者SQLWARNING、NOT FOUND、SQLEXCEPTION.

  • SQLWARNING是以所有01开头的SQLSTATE代码的速记。
  • NOT FOUND是对所有以02开头的SQLSTATE代码的速记。
  • SQLEXCEPTION是其他SQLSTATE代码的速记。

光标的使用

  在存储过程和函数中可以使用光标对结果进行循环的处理。光标的使用包括声明、OPEN、FETCH和CLOSE。

  注意:变量、条件、处理程序和光标都是通过DECLAER定义,它们之间存在先后顺序。变量和条件必须定义在最前面,然后是光标的声明最后是处理程序。

流程控制

  可以使用IF、CASE、LOOP、LEAVE、ITERATE、REPEAT及WHILE语句进行流程控制。

  IF语句进行条件判断。满足不同的条件执行不同语句列表,具体语法如下:

   CASE语句和IF语句功能类似,具体语法如下:

  例如

  LOOP语句实现简单的循环,退出循环的条件需要使用其他的语句定义,通常可以使用LEAVE实现,具体语法如下:

  LEAVE语句用来从标准的流控制中退出,通常可以和BEGIN...AND或者循环一起使用.

  ITERATE语句必须在循环使用,作用是跳出当前循环剩下的语句,直接进入下一轮循环。

  REPEAT语句是有条件的循环控制语句,当条件满足的时候退出循环,具体语法如下

  WHILE语句实现的也是有条件的循环控制语句,即当满足条件时执行循环的内容,具体的语法如下:

  WHILE循环和REPEAT循环的区别在于:WHILE是满足条件才执行循环,REPEAT是满足条件退出循环;WHILE最少执行0次,REPEAT最少执行一次。

  事件调度器可以将数据库按照自定义的时间周期触发某种操作,可以理解为时间触发器。例如

CREATE EVENT myevent
ON SCHEDULE AT CURRENT_TIMESTAMP+INTERVAL 1 HOUR
DO
UPDATE `mysql`.`user` SET mucol=mycol+1;
  • 事件名在CREATE EVENT后定义;
  • 通过ON SCHEDULE AT子句制定时间在何时执行及执行频次;
  • 通过DO子句制定要执行的操作或事件;

  事件调度器默认是关闭的,可以通过如下语句打开、关闭和删除事件调度器。

SET GLOBAL event_scheduler=1;//打开
ALTER EVENT myevent DISABLE;//关闭
DROP EVENT myevent;//删除

转载于:https://www.cnblogs.com/wxgblogs/p/5744476.html

相关文章:

  • 配置中心
  • 如何设置游戏分辨率(C++)
  • go任务调度6(etcd租约机制/自动过期)
  • 搜索引擎网址提交入口
  • UVA713 UVALive5539 POJ1504 ZOJ2001 Adding Reversed Numbers
  • centos查看启动时间
  • Etsy如何及为什么迁移到API优先的架构
  • SpringBoot中AOP的配置
  • iOS标准库中常用数据结构和算法之查找
  • CoreText实现图文混排之点击事件-b
  • 性能优化技巧 - 集群维表
  • 不同机器下,游戏编程如何保证物体移动具有相同的速度
  • 量子通信是个鸡肋,没有证券分析师说得那么好
  • 微信,QQ这类IM app怎么做——谈谈Websocket
  • DRF如何序列化外键的字段
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • Java 内存分配及垃圾回收机制初探
  • java取消线程实例
  • LeetCode算法系列_0891_子序列宽度之和
  • Markdown 语法简单说明
  • Meteor的表单提交:Form
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • Node 版本管理
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • WePY 在小程序性能调优上做出的探究
  • windows下如何用phpstorm同步测试服务器
  • 第十八天-企业应用架构模式-基本模式
  • 浅谈JavaScript的面向对象和它的封装、继承、多态
  • 它承受着该等级不该有的简单, leetcode 564 寻找最近的回文数
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 为视图添加丝滑的水波纹
  • 小程序开发中的那些坑
  • 原生js练习题---第五课
  • 正则与JS中的正则
  • const的用法,特别是用在函数前面与后面的区别
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • # 计算机视觉入门
  • #ifdef 的技巧用法
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • #NOIP 2014# day.2 T2 寻找道路
  • #stm32驱动外设模块总结w5500模块
  • $ git push -u origin master 推送到远程库出错
  • (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (九)信息融合方式简介
  • (三)终结任务
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (一)RocketMQ初步认识