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

在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) 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数据库新特性之存储过程入门教程

时间: 2024-12-08 04:32:33

MySQL数据库新特性之存储过程入门教程的相关文章

Mysql 与 php动态网站开发 入门教程

这个系列的教程由表单开始写,因为表单可以把数据库和web 之间的交互表现得很明显.提交表单 ,数据库记录注册信息. 本教程属于基础教程.大神请略过. 对于php和mysql之间的稳固性很受程序员的喜爱.虽说最近出现了hack语言准备替代php语言,但是这个语言本身也是基于php的,后面我们可以对hack语言进行一定得学习. 好像博客园有好多大牛,不知道会不会被喷,好怕 ........当然,我是借着自己学习的这股劲,把学习的过程也给记录下来.教程涉及  html 表单 简单的php 和mysql

Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014

Atitit.数据库新特性 mssql sql server 2008 SQL2012 SQL2014 1. Sql2012 新特性 1 1.1. 增加了Sequence对象. 1 1.2. 新的分页查询语法.offset和fetch 1 1.3. OVER子句的增强和新增一些分析函数. 之前OVER子句是用于RANK,ROW_NUMBER等排名函数,现在OVER子句得到了大大的增强, 可以将OVER子句应用到聚合函数中,也增加了一些分析函数. 2 1.4. 增强的审计功能 2 1.5. 增强的

spring4.0.6最新稳定版新特性学习,简单学习教程(一)

Spring Framework 4.0 学习整理. Spring框架的核心部分就是Ioc容器,而Ioc控制的就是各种Bean,一个Spring项目的水平往往从其XML配置文件内容就能略知一二,很多项目,往往是外包公司的项目,配置文件往往是乱七八糟,抱着能跑就行,不报错就行的态度去写,然后在项目中后期发现各种缺失又去一通乱补,其结果就是,整个文档可读性极差,毫无章法.这也不能怪写这个XML的人,拿着苦逼程序员的工资干着架构师的工作必然是这个结果.为了程序员的幸福,我认为有必要来一套简单快速的官方

Mysql数据库四大特性、事物的四个隔离、基本MySQL语句、独立表空间

Mysql数据库四大特性.事物的四个隔离.基本MySQL语句.独立表空间 本人学习mysql的时候感觉笔记有点散所以自己做了一个整合,而且有些概念介绍的太官方了,所以自己根据理解总结了一下.(有不对的请指点!) mysql: sql:关系型数据库:(复杂的关系形数据库). nosql:非关系型数据库:(储存的格式很简单) key,value(memcached),user1:1,user2:2(存在内存里) 事务:一组原子性的SQL查询,或者是一个或多个sql语句组成的独立工作单元:操作要么都执

MySQL 8 新特性之信用盘源码搭建出售降序索引实现

什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: 信用盘源码搭建出售q-1152880099 create index idx_t1_bcd on t1(b,c,d); 上面sql的意思是在t1表中,针对b,c,d三个字段创建一个联合索引. 但是大家不知道的是,上面这个sql实际上和下面的这个sql是等价的: create index idx_t1_bcd on t1(b asc,c asc,d asc); asc

Python使用MySQL数据库(新)(转)

http://www.cnblogs.com/fnng/p/3565912.html 一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可. Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的linux 仓库中都会有mysql ,我们只需要通过一个命令就可以下载安装: Ubuntu\deepin >>sudo apt-get install mysql-server >>Sudo apt-g

python 3.x连接MySQL数据库驱动的下载及使用教程

注意此文章写的是有关与MySQL数据库8.0以上版本的,若以下版本等待更新!!! 首先到MySQL数据库官网找到驱动下载,在这我给出网址:https://dev.mysql.com/downloads/connector/python 进去之后会看到这个界面 这里有选择操作系统和下载格式:一般我们需要下载的是压缩包格式的文件,然而这个界面的都是安装程序,需要选择下载程序文件如图:(教程暂时只有Window教程) Window系统选择zip格式压缩包下载:下载完成后解压如图: python的MyS

Python使用MySQL数据库(新)

之前写过一篇 Python使用MySQL数据库的博客,主要使用的是Python2和MySQLdb驱动. python使用mysql数据库 然而,2016年开始,我从Python2切换到了Python3,Python2已经基本不再使用,MySQLdb驱动从2014年1月停止了维护.所以,打算重新再来写这篇博客. Python2 ---> Python3 MySQLdb --> PyMySQL 一,安装PyMySQL Python是编程语言,MySQL是数据库,它们是两种不同的技术:要想使Pyth

mysql数据库新安装无法启动

mysql数据库源码编译之后,启动失败具体报错日志如下: 2018-04-13 23:45:46 67547 [Note] Plugin 'FEDERATED' is disabled. /usr/local/mysql/bin/mysqld: Table 'mysql.plugin' doesn't exist 2018-04-13 23:45:46 67547 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrad