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

在MySQL 5中,终于引入了存储过程这一新特性,这将大大增强MYSQL的数据库处理能力。在本文中将指导读者快速掌握MySQL 5的存储过程的基本知识,带领用户入门。   存储过程介绍   存储过程是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中。用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量 。同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。   存储过程的优点   作为存储过程,有以下这些优点:   (1) 减少网络通信量。调用一个行数不多的存储过程与直接调用SQL语句的网络通信量可能不会有很大的差别,可是如果存储过程包含上百行SQL语句,那么其性能绝对比一条一条的调用SQL语句要高得多。   (2) 执行速度更快。存储过程创建的时候,数据库已经对其进行了一次解析和优化。其次,存储过程一旦执行,在内存中就会保留一份这个存储过程,这样下次再执行同样的存储过程时,可以从内存中直接中读取。   (3) 更强的安全性。存储过程是通过向用户授予权限(而不是基于表),它们可以提供对特定数据的访问,提高代码安全,比如防止 SQL注入。   (4) 业务逻辑可以封装存储过程中,这样不仅容易维护,而且执行效率也高   当然存储过程也有一些缺点,比如:   (1) 可移植性方面:当从一种数据库迁移到另外一种数据库时,不少的存储过程的编写要进行部分修改。   (2) 存储过程需要花费一定的学习时间去学习,比如学习其语法等。   在MySQL中,推荐使用MySQL Query Browswer(外链网址已屏蔽)这个工具去进行存储过程的开发和管理。下面分步骤来学习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) 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中,要注意游标只能向前遍历,而不能向后,并且注意,游标不能更新,最后关闭游标。

mysql query browswer_MySQL数据库新特性之存储过程入门教程相关推荐

  1. 宋利兵 mysql_《MySQL 5.7 Replication新特性》分享之互动问题解答

    分享主题 <MySQL 5.7 Replication新特性> 嘉宾介绍 宋利兵,MySQL研发工程师.2009年加入MySQL全球研发团队,从事MySQL复制相关功能的开发. 主题介绍 ...

  2. oracle12c 新特性,12c Oracle数据库新特性汇总

    12c Oracle数据库新特性汇总 中文社区 (MOSC) 数据库 (MOSC) 8 Replies Last updated on February 15, 2017 12c Oracle数据库有 ...

  3. 【MySQL】MySQL5.6新特性之Index Condition Pushdown

    一 概念介绍     Index Condition Pushdown (ICP)是MySQL 5.6 版本中的新特性,是一种在存储引擎层使用索引过滤数据的一种优化方式. a 当关闭ICP时,inde ...

  4. mysql sdi_MySQL 8.0新特性: 数据字典

    一.概述 数据字典(Data Dictionary)中存储了诸多数据库的元数据信息,包括基本Database, table, index, column, function, trigger, pro ...

  5. mysql5.7 json特性_【Mysql】Mysql5.7新特性之-json存储

    一 写在前面 本系列文章基于 5.7.12 版本讲述MySQL的新特性.从安装,文件结构,SQL ,优化 ,运维层面 复制,GITD等几个方面展开介绍 5.7 的新特性和功能.同时也建议大家跟踪官方b ...

  6. mysql generated_MySQL 5.7新特性之Generated Column

    这是IMG社区迎来的第一篇投稿,欢迎各位踊跃投稿,共同成长,一起打造最有态度的MySQL社区--IMG.IMG社区的网站,论坛也在完善中,后期会不断推出,目前就让我们在公众账号上讨论吧. IMG官方微 ...

  7. MySQL 5.1.40新特性及下载

    MySQL是现在最流行一个多线程的,结构化查询语言(SQL)数据库服务器.绝大多数PHP网站的数据库后台都是采用这一数据库. MySQL 的执行性能非常高,运行速度非常快,并非常容易使用.是一个非常捧 ...

  8. MySQL 5.7的新特性(新功能)

    与 MySQL 5.6 相比,MySQL 5.7 具有以下几个方面的新功能. 1) 随机 root 密码 MySQL 5.7 数据库初始化完成后,会自动生成一个 root@localhost 用户,r ...

  9. rhel6系统中,mysql 5.6复制新特性下主从复制配置[基于GTID]

    1.mysql5.6在复制方面的新特性: (1).支持多线程复制:事实上是针对每个database开启相应的独立线程,即每个库有一个单独的(sql thread).针对这样的改进,如果我们想实现多线程 ...

最新文章

  1. ExecutorService为创建的线程池ExecutorService pool = Executors.newFixedThreadPool(POOL_SIZE)
  2. x64 gs寄存器的一点资料
  3. 刚弄好的中台!又要开始拆了?难道是为了凑工作量?
  4. oracle树形语句
  5. VMware Ubuntu 共享文件夹
  6. 成功试验基于C#/.NET的Android开发
  7. 在ASP.NET 3.5中使用新的ListView控件(4)
  8. Intel保护模式下的保护机制,Descriptor Fields Used for Protection
  9. VIM插件: NERDTREE[树形目录]安装与使用
  10. 读《半世烟雨,半世桃花 李清照词传》有感
  11. 【每日一练】92—实现一个耳机音箱专卖店网站的静态页面
  12. web服务软件 html5,配置WEB服务器(apache,nginx),支持 html5 video(ogv, webm.etc)播放...
  13. PS仿制图章工具、油桶工具、渐变
  14. 常用免费文献下载平台
  15. 第一台通用计算机发明时间,第一台计算机发明于哪一年?
  16. 虹科案例 | 解决ASRS系统的痛点问题居然这么简单?(下)
  17. Java实现ES增删改查
  18. 修复360篡改的,我的主页
  19. 多目标跟踪算法简述——量测-航机关联
  20. 什么是隐私混币协议Tornado Cash?| Tokenview

热门文章

  1. 面向过程(或者叫结构化)分析方法与面向对象分析方法到底区别在哪里?
  2. volatile关键字之全面深度剖析
  3. AI推理与Compiler
  4. 预测汽车级Linux专业技术的需求
  5. 各种光学仪器成像技术(上)
  6. CVPR 2020目标跟踪多篇开源论文(上)
  7. HDR sensor 原理介绍
  8. n个素数构成等差数列
  9. python 使用sax 解析xml 文件
  10. Git Bash Here 中文显示乱码,有遮挡, 的处理方法