MySql存储过程
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存储过程的更多相关文章
- MySQL存储过程(转)
一.MySQL 创建存储过程 "pr_add" 是个简单的 MySQL 存储过程,这个存储过程有两个 int 类型的输入参数 "a"."b" ...
- mysql存储过程和存储函数
mysql存储过程和存储函数 存数函数代码示例: DROP PROCEDURE IF EXISTS calc_ci_day_suc_rate; delimiter // CREATE FUNCTION ...
- mysql存储过程编写-入门案例-遁地龙卷风
(-1)写在前面 这篇文章只是简要的叙述了mysql存储过程编写的基本概念. 我使用的mysql版本是5.7.9-log. 参照<<深入浅出MySQL>>. (0) delim ...
- MySQL存储过程动态SQL语句的生成
用Mysql存储过程来完成动态SQL语句,使用存储过程有很好的执行效率: 现在有要求如下:根据输入的年份.国家.节假日类型查询一个节假日,我们可以使用一般的SQL语句嵌入到Java代码中,但是执行效率 ...
- MySQL 存储过程
MySQL 存储过程 存储过程是通过给定的语法格式编写自定义的数据库API,类似于给数据库编写可执行函数. 简介 存储过程是一组为了完成特定功能的SQL语句集合,是经过编译后存储在数据库中. 存储过程 ...
- mysql存储过程详解
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
- PHP调用MYSQL存储过程实例
PHP调用MYSQL存储过程实例 标签: mysql存储phpsqlquerycmd 2010-09-26 11:10 11552人阅读 评论(3) 收藏 举报 实例一:无参的存储过程$conn = ...
- mysql存储过程语法及实例
存储过程如同一门程序设计语言,同样包含了数据类型.流程控制.输入和输出和它自己的函数库. --------------------基本语法-------------------- 一.创建存储过程cr ...
- java, mybatis, 调用mysql存储过程
Map<String, Object> bindinfo = new HashMap<String, Object>(); bindinfo.put(&q ...
随机推荐
- .Net开源工作流Roadflow的使用与集成
序言 最近公司要整理公司内部oa系统,需要使用到工作流,所以就开始了开源工作流挑选,使用,到集成到公司内部系统的工作. 首先在网上搜了文档,自己也有补充,整理啦国内几款工作流的比较,由于没有个个击破式 ...
- 【Win 10应用开发】使用RichEditBox控件应注意的问题
RichEditBox控件支持对多格式文本进行编辑,一般的文本输入控件可以使用TextBox,不过,如果希望编辑格式较为复杂的文本,就可以考虚使用RichEditBox控件. RichEditBox控 ...
- UploadFile控件,提交图片后,页面预览显示刚刚提交的图片
最近在用asp.net来写一个新闻系统后台,然后由于不用用网上的flash插件来上传图片什么的,我就用asp.net的控件来写,但是控件总归有一些用的不够灵活的地方.这次测试提出,文章在修改的时候,需 ...
- c 算牌器代码
int main() { // 算牌器 ]; ; do { printf("请输入牌名: \n"); scanf("%2s",char_name); ; ]) ...
- Hibernate(2)——Hibernate的实现原理总结和对其模仿的demo
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: 开源框架的学习思路(个人总结) Hibernate的运行原理总结 Hibernate实现原理中的两个主要技术 ...
- 用c-free 5写一个入门的程序
本文记录了在windows系统中使用C-FREE 5新建一个Hello HoverTree程序的步骤. 安装好C-Free 5之后,打开.新建一个工程: 附C-Free 5下载:http://hove ...
- alienware Win8 系统安装
原作者网名 alienware-小来: 我的外星人 老是装系统出错.我觉得写的不错.把原作者的东西拿过来.. 对于win7系统的用户来说想要体验下win8.1系统,或者是原来win8.1系统加装固态后 ...
- 【无私分享:ASP.NET CORE 项目实战(第十四章)】图形验证码的实现
目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 很长时间没有来更新博客了,一是,最近有些忙,二是,Core也是一直在摸索中,其实已经完成了一个框架了,并且正在准备在生产环境中 ...
- 开源物联网通讯框架ServerSuperIO,成功移植到Windows10 IOT,在物联网和集成系统建设中降低成本。附:“物联网”交流大纲
[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 一.概述 经过一个多月晚上的时间,终于把开源物联网通讯框架ServerSuperIO成功移植到Windows10 IOT上, ...
- jQuery中的$.extend方法来扩展JSON对象及合并,方便调用对象方法
$.extend方法可以扩展JSON对象,用一个或多个其他对象来扩展一个对象,返回被扩展的对象. 例一 合并 settings 和 options,修改并返回 settings var setting ...