MySQL 存储过程

存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数。

简介

存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中。

存储过程增强了SQL语言的功能和灵活性,它可以使用流控制语句编写来完成复杂的判断和计算。

存储过程是把完成特定功能的SQL语句集合统一在数据库中进行处理,避免了多次网络IO请求造成的网络负载。

mysql> DELIMITER //
mysql> CREATE PROCEDURE proc1(OUT s int)
-> BEGIN
-> SELECT COUNT(*) INTO s FROM person;
-> END //
mysql> DELIMITER;

基本语法

基本结构

DELIMITER //
DROP PROCEDURE IF EXISTS some_func;
CREATE PROCEDURE some_func
(
IN param1 INT,
IN param2 VARCHAR(32),
OUT res INT
)
BEGIN
SQL-SCRIPT
END //
DELIMITER;

调用语句如下,

CALL some_func(params...);

变量

在存储过程中,函数参数包含三种变量,

  • IN 输入参数,必须在调用存储过程时指定
  • OUT 输出参数,可在存储过程内部被改变,返回该结果
  • INOUT 输入输出参数,调用时指定并且可被改变和返回

在存储过程内部,参数的定义如下,

DECLARE var_name [, var_name] var_type [default value];

用户变量

SET @mvar = 'Hello World';

变量赋值

SET var_name = 表达式;

条件语句

if var=0 then
insert into person values ('f');
else
insert into person values ('ff');
end if;

case语句

case var
when 0 then
insert into person values ('f');
when 1 then
insert into person values ('ff');
else
insert into person values ('fff');
end case;

循环语句

WHILE语句,同C语言中的while语句一样。

while var < N do
insert into person values ('f');
set var = var + 1;
end while;

REPEAT语句,类似于C语言中的do while语句。

repeat
insert into person values ('f');
set var = var + 1;
until var >= N
end repeat;

LOOP语句,没有结束的判断语句,利用leave来跳出循环,类似于break。

set @var = 0;
loop_name:loop
set @var = @var + 1;
if @var > 5 then
leave loop_name;
end if;
end loop loop_name;
select @var;

基本函数

mysql内置了一些函数,这些函数可以极大地提高编写存储过程的效率。

字符串操作如下,

CHARSET(str) //获取字符集
CONCAT(str1, str2, ...) //联接字符串
INSTR(str, substr) //返回substr出现在str中的第一个位置
LOCATE(substr, str, start_position) //返回substr在str的start_position开始第一次出现的位置
LCASE(str) //将所有字符转换为小写
LEFT(str, length) //返回str从左边开始的length个字符
LENGTH(str) //返回str长度
LOAD_FILE(file_name) //读取文见内容
LPAD(str, length, pad) //重复在str的首部插入pad,直到str的长度达到length
LTRIM(str) //去除str首部的空格
RTRIM(str) //去除str尾部的空格
STRCMP(str1, str2) //字符串比较
SUBSTRING(str, start_position, length) //截取字符串,默认第一个字符下标为1

math相关操作如下,

ABS(i) //绝对值
BIN(i) //十进制->二进制
CEILING(i) //向上取整
CONV(i, from, to) //进制转换
FLOOR(i) //向下取整
FORMAT(i, n) //保留小数位数
HEX(i) //转十六进制
LEAST(i0, i1, i2, ..) //求最小值
MOD(i, demoninator) //求余
POWER(I, POWER) //求指数
RAND([seed]) //随机数
ROUND(I, [, DECIMALS]) //四舍五入,decimals为保留小数位数
SQRT(number2) //开平方

时间相关操作如下,

ADDTIME (date2 ,time_interval ) //将time_interval加到date2
CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区
CURRENT_DATE ( ) //当前日期
CURRENT_TIME ( ) //当前时间
CURRENT_TIMESTAMP ( ) //当前时间戳
DATE (datetime ) //返回datetime的日期部分
DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间
DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime
DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间
DATEDIFF (date1 ,date2 ) //两个日期差
DAY (date ) //返回日期的天
DAYNAME (date ) //英文星期
DAYOFWEEK (date ) //星期(1-7) ,1为星期天
DAYOFYEAR (date ) //一年中的第几天
EXTRACT (interval_name FROM date ) //从date中提取日期的指定部分
MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串
MAKETIME (hour ,minute ,second ) //生成时间串
MONTHNAME (date ) //英文月份名
NOW ( ) //当前时间
SEC_TO_TIME (seconds ) //秒数转成时间
STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示
TIMEDIFF (datetime1 ,datetime2 ) //两个时间差
TIME_TO_SEC (time ) //时间转秒数]
WEEK (date_time [,start_of_week ]) //第几周
YEAR (datetime ) //年份
DAYOFMONTH(datetime) //月的第几天
HOUR(datetime) //小时
LAST_DAY(date) //date的月的最后日期
MICROSECOND(datetime) //微秒
MONTH(datetime) //月
MINUTE(datetime) //分返回符号,正负或0

参考

http://xdj651897373-126-com.iteye.com/blog/1819924

http://blog.tankywoo.com/2015/04/01/mysql-stored-procedure.html

http://stackoverflow.com/questions/8549619/mysql-dynamically-build-query-string-in-a-stored-procedure-based-on-logic

MySQL 存储过程的更多相关文章

  1. MySQL存储过程(转)

    一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...

  2. MySql存储过程

    MySQL 存储过程 ```sql CREATE PROCEDURE myprocedure (IN para01 INTEGER) BEGIN DECLARE var01 CHAR(10); IF ...

  3. mysql存储过程和存储函数

    mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...

  4. mysql存储过程编写-入门案例-遁地龙卷风

    (-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...

  5. MySQL存储过程动态SQL语句的生成

    用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...

  6. mysql存储过程详解

    mysql存储过程详解 1.      存储过程简介   我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...

  7. PHP调用MYSQL存储过程实例

    PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...

  8. mysql存储过程语法及实例

    存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...

  9. java, mybatis, 调用mysql存储过程

    Map<String, Object> bindinfo = new HashMap<String, Object>();            bindinfo.put(&q ...

随机推荐

  1. 忘记XP密码的解决方案

    仅供教学与研究用,后果自负! !! USE AT YOUR OWN RISK !! !! ONLY FOR EDUCATIONAL PURPOSE !! 介绍 获取SYSTEM权限.测试通过. 进入G ...

  2. 了解 xcodebuild 命令 ,自动打包ipa

    引用博客:http://blog.nswebfrog.com/2015/10/31/xcodebuild/ 在 iOS 开发中,如果需要把工程打包成 ipa 文件,通常的做法就是在 Xcode 里点击 ...

  3. vim 基本使用

    vim 下基本命令 重新加载 .vimrc source ~/.vimrc 列出当前缓冲区的所有文档 ls 然后使用 b+编号 移至该文档 选中多行 v + shift 然后 j k 上下移动 缩进单 ...

  4. InnoDB还是MyISAM 再谈MySQL存储引擎的选择

    两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用. 我作为使用MySQL的用户角度出发,Innodb和My ...

  5. RQNOJ 490 环形石子合并

    题目链接:https://www.rqnoj.cn/problem/490 题目描述 在一个园形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆.规定每次只能选相邻的2堆合并成新的一堆,并将新的一 ...

  6. NOIp 2016 总结

    NOIp 2016 总结 -----YJSheep Day 0 对于考前的前一天,晚自习在复习图论的最短路和生成树,加深了图的理解.睡得比较早,养足精力明日再战. Day 1 拿到题目,先过一边,题目 ...

  7. java-并发-保护代码块

    浏览以下内容前,请点击并阅读 声明 线程经常需要协调其动作,最常用的协调方法就是保护代码块,该代码块以一个条件判断开始,当判断为true时才能开始执行. 假设一个方法guradedJoy必须等到变量j ...

  8. ElasticSearch问题记录

    1.Young GC导致集群master重新选举,一台server fail [2016-12-10 07:38:24,546][WARN ][transport ] [BFRD_1] Receive ...

  9. bug: 在缓存行高时,总是记录错误.

    一,现象: 1.在 cell 中添加了一个 label, 并对 label 设置了 attributeText, 结果滑动的过程中,cell 的高度总是不对,多次出现下一个 cell 覆盖上一个 ce ...

  10. 关于 IE6、 IE7兼容性总结(转)

    其实浏览器的不兼容,我们往往是各个浏览器对于一些标准的定义不一致导致的,因此,我们可以进行一些初始化,很多问题都很轻松解决. 下面是14条特殊情况仅供参考: 1. 文字本身的大小不兼容.同样是font ...