MySQL存储过程入门教程

  存储过程介绍

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

  存储过程和函数的区别

  函数往往作为公式使用,存储过程作为完成某种功能使用。

 函数分为表值函数跟标量函数。表值函数是经过一些sql语句方法最后返回一张表,标量函数是经过一些sql语句方法最后返回一个值。
 函数可以在select语句中直接使用,而过程不能。

  存储过程的优点

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

  (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 SQLDETERMINISTICSQL SECURITY DEFINERCOMMENT ‘A procedure‘BEGINSELECT‘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_employeeMODIFIES 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)BEGIN    SELECT var1 + 2 AS result;END//

  输出OUT参数例子如下:

DELIMITER //CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))BEGIN  SET var1 = ‘This is a test‘;END //

  IN-OUT的例子:

DELIMITER //CREATE PROCEDURE `proc_INOUT` (OUT var1 INT)BEGIN  SET 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))BEGIN  DECLARE 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)BEGIN  DECLARE variable1 INT;  SET variable1 = param1 + 1;  IF variable1 = 0 THEN      SELECT variable1;  END IF;  IF param1 = 0 THEN      SELECT ‘Parameter value = 0‘;  ELSE      SELECT ‘Parameter value <= 0‘;  END IF;END //

  CASE语句

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

  第一种写法:

DELIMITER //CREATE PROCEDURE `proc_CASE` (IN param1 INT)BEGIN  DECLARE variable1 INT;  SET variable1 = param1 + 1;  CASE variable1  WHEN 0 THEN      INSERT INTO table1 VALUES (param1);  WHEN 1 THEN      INSERT INTO table1 VALUES (variable1);  ELSE      INSERT INTO table1 VALUES (99);  END CASE;END //

  另外一种写法:

DELIMITER //CREATE PROCEDURE `proc_CASE` (IN param1 INT)BEGIN  DECLARE variable1 INT;  SET variable1 = param1 + 1;  CASE  WHEN variable1 = 0 THEN      INSERT INTO table1 VALUES (param1);  WHEN variable1 = 1 THEN      INSERT INTO table1 VALUES (variable1);  ELSE      INSERT INTO table1 VALUES (99);  END CASE;END //

  WHILE语句

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

DELIMITER //CREATE PROCEDURE `proc_WHILE` (IN param1 INT)BEGIN  DECLARE variable1, variable2 INT;  SET variable1 = 0;  WHILE variable1      INSERT 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)BEGIN  DECLARE 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 DO      FETCH cur1 INTO a;      IF b = 0 THEN          SET 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中,要注意游标只能向前遍历,而不能向后,并且注意,游标不能更新,最后关闭游标。

时间: 2024-07-31 04:34:01

MySQL存储过程入门教程的相关文章

MySQL数据库新特性之存储过程入门教程

在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力.在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门. 存储过程介绍 存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中.用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 .同时,存储过程可以接收和输出参数.返回执行存储过程的状态值,也可以嵌套调用. 存储过程的优点 作为存储过程,有以

MySQL 超级入门教程

MySQL简介 1.什么是数据库 ? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,它产生于距今六十多年前,随着信息技术和市场的发展,特别是二十世纪九十年代以后,数据管理不再仅仅是存储和管理数据,而转变成用户所需要的各种数据管理的方式.数据库有很多种类型,从最简单的存储有各种数据的表格到能够进行海量数据存储的大型数据库系统都在各个方面得到了广泛的应用. 主流的数据库有:sqlserver,mysql,Oracle.SQLite.Access.MS SQL Server等,

mysql存储过程入门与提高(第三篇)

由于一些不好说的原因,以后博客内容大多只会发笔记的截图.此博客只发在my.oschina.net上,请勿作任何商业用途!! mysql存储过程:是指在数据库中定义一组sql语句组合在一起,并当作一个整体存储在mysql服务器中. 和存储函数的最主要的区别是对于存储过程来说可以返回参数,如记录集,而函数只能返回值或者表对象.函数只能返回一个变量:而存储过程可以返回多个.my.oschina.net讲存储函数的时候会把储存过程和存储函数的区别列出来.my.oschina.net 基本形式: CREA

mysql存储过程详细教程

记录mysql存储过程中的关键语法:DELIMITER //  声明语句结束符,用于区分;CREATE PROCEDURE demo_in_parameter(IN p_in int)  声明存储过程BEGIN .... END  存储过程开始和结束符号SET @p_in=1   变量赋值 DECLARE l_int int unsigned default 4000000;  变量定义 什么是mysql存储例程? 存储例程是存储在数据库服务器中的一组sql语句,通过在查询中调用一个指定的名称来

mysql存储过程入门与提高(第二篇)

以前面试的时候被问道为啥用mysql存储过程,或者存储过程的优点.作为一个专业的mysql dba.肯定是必须要掌握的.而我只是运维啊 哈哈哈.当时回答的不好,后来整理了 大概这几条,存储过程执行速度快,存储过程能够减少网络流量,提高应用程序代码的灵活性,提高数据安全保护机制. 狂汗啊!看人家洋鬼子整理的多齐整啊.师夷长技以制夷,奋起啊!!! ? The use of stored programs can lead to a more secure database.? Stored prog

mysql存储过程入门与提高(第一篇)

以前在网上看到歪国人专门写了本mysql存储过程,感觉很强大啊.刚好最近新项目上优化要用到存储过程,我就把之前的学习笔记整理了一下.最近太忙啊!!! MySQL stored programs包括存储过程,函数,触发器. 先来看一下官方的定义. Stored procedures 存储过程Stored procedures are the most common type of stored program. A stored proce-dure is a generic program un

mysql 存储过程入门

这篇文章主要介绍了MySql存储过程与函数详解,内容很详细,需要的朋友可以参考下 存储过程和函数是在数据库中定义一些SQL语句的集合,然后直接调用这些存储过程和函数来执行已经定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句.而且,存储过程和函数是在MySQL服务器中存储和执行的,可以减少客户端和服务器端的数据传输.一.存储过程1.1.基本语法 CREATE PROCEDURE sp_name ([proc_parameter[,...]])     [characte

Mysql存储过程入门介绍

delimiter //一般情况下MYSQL以:结尾表示确认输入并执行语句,但在存储过程中:不是表示结束,因此可以用该命令将:号改为//表示确认输入并执行. 一.创建存储过程 1.基本语法: create procedure sp_name()begin.........end 2.参数传递 二.调用存储过程 1.基本语法:call sp_name()注意:存储过程名称后面必须加括号,哪怕该存储过程没有参数传递 三.删除存储过程 1.基本语法:drop procedure sp_name//2.

MySQL初学者入门教程

1.MySQL安装(Window7 安装) 在任何版本的 Windows 默认安装是现在比以前要容易得多,MySQL巧妙地打包安装程序.只需下载安装包,随地把它解压缩,并运行 mysql.exe. 下载地址:http://dev.mysql.com/downloads/ 页面如下图所示: 这里点击:DOWNLOAD 链接,进入一下页面: 这里点击:DOWNLOAD 链接,进入一下页面: 这里要求注册网站帐号,但可以直接通过.如上点击 "No thanks, just start my downl