MySQL 存储过程

```sql
CREATE PROCEDURE myprocedure
(IN para01 INTEGER)
BEGIN
DECLARE var01 CHAR(10);
IF para01 = 17 THEN
SET var01 = 'birds';
ELSE
SET var01 = 'beasts';
END IF;
INSERT INTO table1 VALUES(var01);
END
```

创建实例

```sql
CREATE PROCEDURE p1 /*声明存储过程*/
() /*参数列表*/
SELECT * FROM table_t; /*主体*/
```

调用存储过程

```sql
CALL proc01();
```

特征子句

```sql
CREATE PROCEDURE p2
()
LANGUAGE SQL /*系统默认的,说明主体使用sql语句*/
NOT DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'AN EXAMPLE PROCEDURE'
SELECT CURRENT_DATE, RAND() FROM table_t;
```

特征子句反映存储过程的特性,在括号之后,主体之前。

参数

```sql
CREATE PROCEDURE proc
()
...
```

括号里面用于存放参数列表通过IN(入参),OUT(返回值),INOUT(入参和出参相同)

声明变量

```sql
CREATE PROCEDURE p8
()
BEGIN
DECLARE a INTEGER;
DECLARE b INTEGER;
SET a = 5;
SET b = 6;
INSERT INTO table1 VALUES(a);
SELECT s1*a FROM table1 WHERE s1 >= b;
END;
```

指定默认值

```sql
CREATE PROCEDURE p8
()
BEGIN
DECLARE a INTEGER DEFAULT 5;
DECLARE b INTEGER DEFAULT 5;
INSERT INTO table1 VALUES(a);
SELECT s1*a FROM table1 WHERE s1 >= b;
END;
```

作用域

```sql
CREATE PROCEDURE p8
()
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'outer';
BEGIN
DECLARE x1 CHAR(5) DEFAULT 'inner';
SELECT x1;
END;
END;
```

条件表达式

```sql
CREATE PROCEDURE p12
(IN para01 INTEGER)
BEGIN
DECLARE var01 INTEGER;
SET var01 = para01+1;
IF var01 = 0 THEN
INSERT INTO table1 VALUES(17);
END IF;
IF para01 = 0 THEN
UPDATE table1 SET s1 = s1+1;
ELSE
UPDATE table1 SET s1 = s1 +2;
END IF;
END;
```

CASE 指令

```sql
CREATE PROCEDURE p12
(IN para01 INTEGER)
BEGIN
DECLARE var01 INTEGER;
SET var01 = para01 + 1;
CASE var01
WHEN 0 THEN INSERT INTO table1 VALUES(12);
WHEN 1 THEN INSERT INTO table1 VALUES(90);
ELSE INSERT INTO table1 VALUES(80);
END CASE;
END;
```

循环

一种是类似编程语言中的while循环,另一种是do...while循环,还有一种是loop

```sql
CREATE PROCEDURE p12
()
BEGIN
DECLARE var01 INTEGER;
SET var01 = 0;
WHILE var01 < 5 DO
INSERT INTO table1 VALUES(var01);
SET var01 = var01 +1;
END WHILE;
END;
``` ```sql
CREATE PROCEDURE p23
()
BEGIN
DECLARE var01 INTEGER;
SET var01 = 0;
REPEAT
INSERT INTO table1 VALUES(12);
SET var01 = var01 + 1;
UNTIL var01 >=5;
END REPEAT;
END;
```

LEAVE 类似break

sql CREATE PROCEDURE p123 () BEGIN DECLARE var01 INTEGER; SET var01 = 0; myloop: LOOP INSERT INTO table1 VALUES(var01); SET var01 = var01 + 1; IF var01 >= 5 THEN LEAVE myloop; END IF; END LOOP; END;

ITERATE 类似循环中使用的continue

sql CREATE PROCEDURE p123 () BEGIN DECLARE var01 INTEGER; SET var01 = 0; myloop: LOOP INSERT INTO table1 VALUES(var01); SET var01 = var01 + 1; IF var01 >= 5 THEN ITERATE myloop; END IF; END LOOP; END;

标签

标签增加可读性

```sql
CREATE PROCEDURE p34
()
label_01: BEGIN
label_02: WHILE 0 =1 DO
LEAVE label_02;
END WHILE label_02;
END label_01;
```

异常处理

```sql
CREATE PROCEDURE p22
(IN para01 INTEGER)
BEGIN
DECLARE EXIT HANDLER FOR 1215 /*声明异常处理器*/
INSERT INTO error_log VALUES(error_msg);
INSERT INTO table1 VALUES(para01);
END;
``` 异常声明语法:
DECLARE
{EXIT|CONTINUE} //退出还是继续
HANDLER FOR
{error-number|{SQLSTATE error-string}|condition} //异常的原因
SQL statement //捕获异常后执行的sql语句 ```sql
CREATE PROCEDURE p34
()
BEGIN
DECLARE CONTINUE HANDLER
FOR SQLSTATE '23000'
SELECT * FROM table1; /*当出现23000的错误后,会自动执行改行*/ sql... END;
```

condition 声明,就是给异常处理器命名

```sql
CREATE PROCEDURE p45
()
BEGIN
DECLARE 'Constraint Violation'
CONDITION FOR SQLSTATE '23000';
DECLARE EXIT HANDLER FOR
'Constraint Violation'
ROLLBACK;
START TRANSACTION;
INSERT INTO table1 VALUES(1);
COMMENT;
END;
```

游标

```sql
CREATE PROCEDURE p25
(OUT returnval INTEGER)
BEGIN
DECLARE a,b INTEGER;
DECLARE cur01 CURSOR FOR
SELECT s1 FROM table1;
DECLARE CONTINUE HANDLER FOR
NOT FOUND
SET b = 1;
OPEN cur01;
REPEAT
FETCH cur01 INTO a;
UNTIL b = 1;
END REPEAT;
CLOSE cur01;
SET returnval = a;
END;
```

声明顺序:先声明普通变量,然后声明游标,最后声明异常处理器。

游标的特性

在mysql5.0 中,游标是只读的,而且只能顺序读取,也不能执行更新操作。

函数

```sql
CREATE FUNCTION factorial
(n DECIMAL(3,0))
DETERMINISTIC
BEGIN
DECLARE factorial DECIMAL(20,0) DEFAULT 1;
DECLARE counter DECIMAL(3,0);
SET counter = n;
factorial_loop: REPEAT
SET factorial = factorial * counter;
SET counter = counter + 1;
UNTIL counter =1
END REPEAT;
RETURN factorial;
END;
```

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

  1. MySQL存储过程(转)

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

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

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

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

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

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

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

  5. MySQL 存储过程

    MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...

  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. MySQL触发器-条件触发器语法

    文章为作者原创,未经许可,禁止转载.    -Sun Yat-sen University 冯兴伟 实验4 触发器 )实验目的 掌握数据库触发器的设计和使用方法 )实验内容和要求 定义BEFORE触发 ...

  2. Python遇到字符编码出问题的一个相对万能的办法

    在使用Python做爬虫的过程中,经常遇到字符编码出问题的情况. UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' ...

  3. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  4. SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

    本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. ...

  5. 你真的会玩SQL吗?实用函数方法汇总

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  6. C++程序员如何转Java

     C++程序员如何转Java 忙里偷闲,到了这个时间终于得空写一篇早想写的文章.其实本文的标题有些不太准确,C++程序员写Java代码不是说就非得转行写Java,抛弃C++,而只是多了一个选择而已.两 ...

  7. ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作

    原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...

  8. Bootstrap 4-alpha 初体验

    What is Bootstrap? 第一句话就是废话了,作为新时代有理想有节操的开发人员无人不知无人不晓.可能就是熟悉程度因为各种原因不尽相同,有人只是知道他大概是个什么东西,有些人可能基本可以使用 ...

  9. 手把手教从零开始在GitHub上使用Hexo搭建博客教程(二)-Hexo参数设置

    前言 前文手把手教从零开始在GitHub上使用Hexo搭建博客教程(一)-附GitHub注册及配置介绍了github注册.git相关设置以及hexo基本操作. 本文主要介绍一下hexo的常用参数设置. ...

  10. C#-#define条件编译

    本文导读: C#的预处理器指令从来不会转化为可执行代码的命令,但是会影响编译过程的各个方面,常用的预处理器指令有#define.#undef.#if,#elif,#else和#endif等等,下面介绍 ...