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. 第三十一篇:SOUI布局之相对于特定兄弟窗口

    SOUI中通过pos的标志如:[, {, }, ],这4个标志可以相对于前一个及后一个兄弟窗口,但是有时候希望相对于不是前后窗口的兄弟窗口,比如一个通过一个中心窗口同时定义它的上下左右4个窗口,这个时 ...

  2. dotnet Core Asp.net 项目搭建

    Asp.Net Core 介绍 Asp.Net Core 目前最新版本 1.0.0-preview2-003131 Asp.Net Core官网:https://dotnet.github.io/ A ...

  3. js 弹出确认 取消对话框

    一种: <a href="javascript:if(confirm('确实要删除该内容吗?')){location='http://www.google.com'}"> ...

  4. Android 6.0 - 动态权限管理的解决方案

    Android 6.0版本(Api 23)推出了很多新的特性, 大幅提升了用户体验, 同时也为程序员带来新的负担. 动态权限管理就是这样, 一方面让用户更加容易的控制自己的隐私, 一方面需要重新适配应 ...

  5. 关于安装Apache之后,解析PHP的配置

    需要配置四个地方 LoadModule php5_module modules/libphp5.soServerName localhost:80DirectoryIndex index.phpAdd ...

  6. Navicat备份远程Oracle数据库到本地

    公司的数据库是本地的,我只能在公司连,回家就不能跑项目了,一跑就报SQLException,所以希望可以把数据库复制到我的本地来. 因为一直在用Navicat操作数据库,这里就分享一下用Navicat ...

  7. 代码中使用StoryBoard和DoubleAnimation的方法

    TranslateTransformを対象に.DoubleAnimation型のアニメーションを使用して.TranslateTransform.Xプロパティを ”-1 * Imageコントロールの幅” ...

  8. Codeforces CF#628 Education 8 A. Tennis Tournament

    A. Tennis Tournament time limit per test 1 second memory limit per test 256 megabytes input standard ...

  9. ACM: Gym 101047M Removing coins in Kem Kadrãn - 暴力

     Gym 101047M Removing coins in Kem Kadrãn Time Limit:2000MS     Memory Limit:65536KB     64bit IO Fo ...

  10. unity3D脚本中,update ,fixupdate 和lateupdate的区别

    1.MonoBehaviour.Update 更新 当MonoBehaviour启用时,其Update在每一帧被调用. 2.MonoBehaviour.FixedUpdate 固定更新 当MonoBe ...