摘自 :http://www.cnblogs.com/lp-zy/p/4360398.html

在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力。在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门。

  存储过程介绍

  存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。

  存储过程的优点

  作为存储过程,有以下这些优点:

  (1) 减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。

  (2) 执行速度更快。存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接中读取。

  (3) 更强的安全性。存储过程是通过向用户授予权限(而不是基于表),它们可以提供对特定数据的访问,提高代码安全,比如防止 SQL注入。

  (4) 业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高

  当然存储过程也有一些缺点,比如:

  (1) 可移植性方面:当从一种数据库迁移到另外一种数据库时,不少的存储过程的编写要进行部分修改。

  (2) 存储过程需要花费一定的学习时间去学习,比如学习其语法等。

  在MySQL中,推荐使用MySQL Query Browswer(http://dev.mysql.com/doc/query-browser/en/)这个工具去进行存储过程的开发和管理。下面分步骤来学习MYSQL中的存储过程。

  1、定义存储过程的结束符

  在存储过程中,通常要输入很多SQL语句,而SQL语句中每个语句以分号来结束,因此要告诉存储过程,什么位置是意味着整个存储过程结束,所以我们在编写存储过程前,先定义分隔符,我们这里定义//为分隔符,我们使用DELIMITER //这样的语法,就可以定义结束符了,当然你可以自己定义其他喜欢的符号。

  2、如何创建存储过程

  下面先看下一个简单的例子,代码如下:

DELIMITER //
CREATEPROCEDURE `p2` ()
LANGUAGE SQL
DETERMINISTIC
SQL SECURITY DEFINER
COMMENT 'A procedure'
BEGIN
SELECT'Hello World !';
END//

  下面讲解下存储过程的组成部分:

  1) 首先在定义好终结符后,使用CREATE PROCEDURE+存储过程名的方法创建存储过程,LANGUAGE选项指定了使用的语言,这里默认是使用SQL。

  2) DETERMINISTIC关键词的作用是,当确定每次的存储过程的输入和输出都是相同的内容时,可以使用该关键词,否则默认为NOT DETERMINISTIC。

  3) SQL SECURITY关键词,是表示调用时检查用户的权限。当值为INVOKER时,表示是用户调用该存储过程时检查,默认为DEFINER,即创建存储过程时检查。

  4) COMMENT部分是存储过程的注释说明部分。

  5) 在BEGIN END部分中,是存储过程的主体部分。

  3、调用存储过程的方法

  调用存储过程的方法很简单,只需要使用call命令即可,后面跟要调用存储过程的名称及输入的变量列表,比如:

CALL stored_procedure_name (param1, param2, ....)
CALL procedure1(10 , 'string parameter' , @parameter_var);

  4、修改和删除存储过程

  可以用ALTER的语法去修改存储过程的主要特征和参数,要修改其存储过程的主体部分的话,必须要先删除然后再重建。比如下面修改存储过程num_from_employee的定义。将读写权限改为MODIFIES SQL DATA,并指明调用者可以执行。代码执行如下:

ALTER PROCEDURE num_from_employee
MODIFIES SQL DATA SQL SECURITY INVOKER ;

  而删除存储过程的语法为使用DROP关键词即可。如下

DROP PROCEDURE IF EXISTS p2;

  5、存储过程的参数

  下面来学习下存储过程中的参数,先看下存储过程中的参数形式,如下:

  CREATE PROCEDURE proc1 () 这个存储过程中是空的参数列表

  CREATE PROCEDURE proc1 (IN varname DATA-TYPE) 这个存储过程中有一个输出参数,名称为varname,后面是跟数据类型DATA-TYPE,IN参数是默认的,因此可以省略不写

  CREATE PROCEDURE proc1 (OUT varname DATA-TYPE) 这个存储过程中varname为输出参数

  CREATE PROCEDURE proc1 (INOUT varname DATA-TYPE) 这个存储过程中,varname既是输入参数也是输出参数

  下面具体看个例子,首先是IN输入参数的例子,如下:

DELIMITER //
CREATE PROCEDURE `proc_IN` (IN var1 INT)
BEGINSELECT var1 + 2 AS result;
END//

  输出OUT参数例子如下:

DELIMITER //
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))
BEGINSET var1 = 'This is a test';
END //

  IN-OUT的例子:

DELIMITER //
CREATE PROCEDURE `proc_INOUT` (OUT var1 INT)
BEGINSET var1 = var1 * 2;
END //

  6、如何定义变量

  下面讲解下MySQL 5存储过程中,如何定义变量。必须显式地在存储过程的一开始声明变量,并指出它们的数据类型,一但声明了变量后,就可以在存储过程中使用,定义变量的语法如下:

  DECLARE varname DATA-TYPE DEFAULT defaultvalue

  举例说明:

DECLARE a, b INT DEFAULT 5;
DECLARE str VARCHAR(50);
DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;
DECLARE v1, v2, v3 TINYINT;

  一旦定义好变量,就可以在存储过程中对其进行赋初值,并进行各类相关的操作,比如:

DELIMITER //
CREATE PROCEDURE `var_proc` (IN paramstr VARCHAR(20))
BEGINDECLARE a, b INT DEFAULT 5;DECLARE str VARCHAR(50);DECLARE today TIMESTAMP DEFAULT CURRENT_DATE;DECLARE v1, v2, v3 TINYINT;INSERT INTO table1 VALUES (a);SET str = 'I am a string';SELECT CONCAT(str,paramstr), today FROM table2 WHERE b>=5;
END //

  7、MYSQL存储过程的语法结构

  MYSQL存储过程中支持IF,CASE,ITERATE,LEAVE LOOP,WHILE和REPEAT等语法结构和语句,在本文中,着重介绍IF,CASE和WHILE语法,因为它们使用的最为广泛。

  IF 语句

  if语句使用的是if…then end if的语法结构,例子如下:

DELIMITER //
CREATE PROCEDURE `proc_IF` (IN param1 INT)
BEGINDECLARE variable1 INT;SET variable1 = param1 + 1;IF variable1 = 0 THENSELECT variable1;END IF;IF param1 = 0 THENSELECT 'Parameter value = 0';ELSESELECT 'Parameter value <= 0';END IF;
END //

  CASE语句

  当有很多IF语句时,就应该考虑使用CASE语句了,它是多分支选择语句,有两种写法:

  第一种写法:

DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGINDECLARE variable1 INT;SET variable1 = param1 + 1;CASE variable1WHEN 0 THENINSERT INTO table1 VALUES (param1);WHEN 1 THENINSERT INTO table1 VALUES (variable1);ELSEINSERT INTO table1 VALUES (99);END CASE;
END //

  另外一种写法:

DELIMITER //
CREATE PROCEDURE `proc_CASE` (IN param1 INT)
BEGINDECLARE variable1 INT;SET variable1 = param1 + 1;CASEWHEN variable1 = 0 THENINSERT INTO table1 VALUES (param1);WHEN variable1 = 1 THENINSERT INTO table1 VALUES (variable1);ELSEINSERT INTO table1 VALUES (99);END CASE;
END //

  WHILE语句

  WHILE语句跟普通编程语言中的while语句差不多,例子如下:

DELIMITER //
CREATE PROCEDURE `proc_WHILE` (IN param1 INT)
BEGINDECLARE variable1, variable2 INT;SET variable1 = 0;WHILE variable1INSERT INTO table1 VALUES (param1);SELECT COUNT(*) INTO variable2 FROM table1;SET variable1 = variable1 + 1;END WHILE;
END //

  8、MYSQL存储过程中的游标

  MySQL中的游标是一个十分重要的概念。游标提供了一种对从表中检索出的数据进行操作的灵活手段,就本质而言,游标实际上是一种能从包括多条数据记录的结果集中每次提取一条记录的机制。MySQL中的游标的语法如下:

DECLARE cursor-name CURSOR FOR SELECT ...; /* 声明一个游标,名称为cursor-name,并用CURSOR FOR SELECT*/
DECLARE CONTINUE HANDLER FOR NOT FOUND /*指定当遍历完结果集后,游标如何继续处理*/
OPEN cursor-name; /*打开游标 */
FETCH cursor-name INTO variable [, variable]; /* 将变量赋值给游标*/
CLOSE cursor-name; /*使用后关闭游标*/

 一个具体的例子如下:

DELIMITER //
CREATE PROCEDURE `proc_CURSOR` (OUT param1 INT)
BEGINDECLARE a, b, c INT;DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;DECLARE CONTINUE HANDLER FOR NOT FOUND SET b = 1;OPEN cur1;SET b = 0;SET c = 0;WHILE b = 0 DOFETCH cur1 INTO a;IF b = 0 THENSET c = c + a;END IF;END WHILE;CLOSE cur1;SET param1 = c;
END //

  其中,DECLARE cur1 CURSOR FOR SELECT col1 FROM table1;

  表示将从table1表中选取col1列的内容放到游标curl中,即每次游标遍历的结果都放在curl中,要注意游标只能向前遍历,而不能向后,并且注意,游标不能更新,最后关闭游标。


MySql存储过程语法及事例相关推荐

  1. mysql的存储过程正负数的变化_《转》mysql存储过程语法及范例

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

  2. MySQL存储过程语法

    MySQL存储过程语法 1.语法结构 2.变量及赋值 2.1.局部变量 2.2.用户变量 2.3.全局变量: 3.出参和入参 4.流程控制 4.1.判断 4.1.1.IF 4.1.2.CASE 4.2 ...

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

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

  4. mysql存储过程语法 if_mysql存储过程语法 if

    MySql存储过程 MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程, ...

  5. Mysql存储过程语法讲解,以及如何用Java调用!

    存储过程(Stored Procedure)是一种在数据库中存储复杂程序,以便外部程序调用的-种数据库对象. 存储过程是为了完成特定功能的SQL语句集,经编译创建并保存在数据库中,用户可通过指定存储过 ...

  6. mysql存储过程语法错误1064_mysql,dos下执行SQL语句创建存储过程出错ERROR 1064 (42000):...

    update1.sql的内容为 DROP PROCEDURE IF EXISTS pcName; CREATE PROCEDURE pcName() BEGIN select 'a'; END; do ...

  7. mysql存储过程语法大全

    http://dev.mysql.com/doc/refman/5.1/zh/stored-procedures.html#flow-control-constructs 第20章:存储程序和函数 目 ...

  8. mysql存储过程语法和游标的语法_MySQL游标存储过程-语法点滴

    CREATE PROCEDURE my_proc() BEGIN -- 需要定义接收游标数据的变量 DECLARE sname VARCHAR(100); DECLARE cattype VARCHA ...

  9. mysql 存储过程 is_Mysql存储过程语法问题...

    小弟对Mysql存储过程语法不太熟悉,以下存储过程在调整过后执行仍不成功,求各位大侠指点指点.. create procedure prc_AddChannel ( id int, iname var ...

  10. mysql中leave和_MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法

    本文主要向大家介绍了MySQL数据库之Mysql存储过程使用LEAVE实现MSSQL存储过程中return语法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. DELIMITER ...

最新文章

  1. 实用技巧:使用 jQuery 异步加载 JavaScript 脚本
  2. ELK Stack 与 Elastic Stack 的异同点
  3. html5录音怎么保存到本地,详解HTML5 录音遇到的坑
  4. Spring Transaction 使用入门 (转)
  5. AD 角色夺取传送注意事项
  6. 回发后动态设置的标题丢失
  7. Starling移动平台开发初体验
  8. 如何将php文件通过后台导入,如何将通过url传到php后台的json在后台再次转换为json格式?...
  9. CSP202006-2 稀疏向量(100分)【map】
  10. 特征图注意力_CV注意力机制论文阅读笔记
  11. 2010年“最具全球竞争力中国公司20强”榜单:
  12. 【运动检测】基于matlab最大互信息运动目标检测【含Matlab源码 1607期】
  13. 通达信版弘历软件指标_弘历软件指标公式源码
  14. Hart/Hart-IP协议 介绍、分析和应用
  15. 计算机网络怎么算默认网关,ip地址子网掩码计算器_默认网关怎么计算_ip 掩码 网关的关系...
  16. 检测手机号是否开通微信
  17. 【转】Ubuntu下用G++编译C++程序
  18. sql函数–汉字转拼音(亲测sqlserver可用) – smileApe – 博客园
  19. IT 接口对接:足迹第十二步接口对接的定义(接口对接分三种:中间库方式的接口对接,Rest格式URL对接和HTTP格式URL对接;)
  20. 河南的抗疫英雄(C语言嘞)

热门文章

  1. Cell右滑的动作状态
  2. OpenGL ES之GLSurfaceView学习一:介绍
  3. error: ignoring return value of 编译错误处理
  4. 布局--------动态添加 相对布局
  5. line search中的重要定理 - 梯度与方向的点积为零
  6. C/C++变量在内存中的分布
  7. 孙鑫VC学习笔记:第十一讲 (五) 如何使窗口具有滚动条
  8. 拓端tecdat|R语言基于协方差的SEM结构方程模型中的拟合指数
  9. (8)数据分析-卡方检验
  10. MatConvnet工具箱文档翻译理解一