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. jquery中ajax返回值无法传递到上层函数

    function通过ajax调用获取后台数据,结果返回出来的结果均为空,代码如下: function chart_coinbase_getdata() { var test = {postdata:& ...

  2. 一个简单的消息提示jquery插件

    最近在工作中写了一个jquery插件,效果如下: 就是一个简单的提示消息的一个东西,支持最大化.最小化.关闭.自定义速度.自定义点击事件,数据有ajax请求和本地数据两种形式.还有不完善的地方,只做了 ...

  3. ExtJs服务器端代理(Ajax)

    服务器端代理: Ajax:在当前域中发送请求 JsonP:跨域的请求 Rest:与服务器进行RESTful(GET/PUT/POST/DELETE)交互 Direct:使用  Ext.direct.M ...

  4. LWIP总结

    介绍 Lwip,light weight IP:是由Adam Dunkels 开发的一个小型开源的TCP/IP协议栈:目前已经为全球共同开发的开源协议:支持TCPIP协议族的核心协议:包括:ARP/I ...

  5. C++字符串格式化库:CPPFormatLibrary

    这个是很久之前写的,去年总结了一下,将其单独提取出来,作为一个开源库放到了GitHub上,然而CPPFormat之类的名字都已经被抢注了,结果只好注册了一个这么蛋疼的名字:CPPFormatLibra ...

  6. HBase JavaAPI操作示例

    package testHBase; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBase ...

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

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

  8. 《UML大战需求分析》阅读随笔(四)

    状态机图(State Machine Diagram),状态机图是通过描述某事物状态的改变来展现流程的.一般适用于流程围绕某个事物展开,例如请假的流程就围绕请假条的展开.语法,开始于结束符号,实心圆表 ...

  9. python 爬虫(二)

    python 爬虫 Advanced HTML Parsing 1. 通过属性查找标签:基本上在每一个网站上都有stylesheets,针对于不同的标签会有不同的css类于之向对应在我们看到的标签可能 ...

  10. iTerm 2 && Oh My Zsh

    一年前,在搞终端的时候偶然一次机会,让我看到了各种强大的DIY界面,这让我很想去自己搞一个.于是在网上不断的寻找资源,也请教了大多数朋友.最终以失败告终.最近,本人又突然想起当时这件事,于是,决定边做 ...