MySql数据库学习--存储过程(1)
在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 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中,要注意游标只能向前遍历,而不能向后,并且注意,游标不能更新,最后关闭游标。
转载于:https://www.cnblogs.com/lp-zy/p/4360398.html
MySql数据库学习--存储过程(1)相关推荐
- MYSQL数据库学习总结
1.数据库概述 1.1.为什么要使用数据库 1.2.数据库与数据库管理系统 为什么要使用数据库? 持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用.大多数情况下,特别是企业 ...
- 研一寒假MySQL数据库学习笔记(三)
研一寒假MySQL数据库学习笔记(三) 本节记录数据库高级查询部分的内容,整理于此便于之后回顾. 1. 上一节补充内容 1.1 案例练习 现在有一个员工表.部门表,两张表之间是一个部门多个员工,一个员 ...
- linux数据库创建score表,MySQL数据库学习笔记
MySQL数据库学习笔记phpma (实验环境:Redhat9.0,MySQL3.23.54) 纲要: 一,连接MySQL phpma 二,MySQL管理与授权 三,数据库简单操作 四, 数据库备份 ...
- MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- mysql 数据库学习(触发器)
引用:http://bbs.mysql.cn/thread-9135-1-2.html 引用:21. 触发程序 create table a (sa int); create table b (sb ...
- MySQL数据库学习笔记(九)----JDBC的ResultSet接口(查询操作)、PreparedStatement接口重构增删改查(含SQL注入的解释)...
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- java JDBC连接MySQL数据库调用存储过程进行查询
java JDBC连接MySQL数据库调用存储过程进行查询 主程序代码 工具类 文件信息 存储过程 结果截图 主程序代码 package Mysql;import util.JDBCUtils; im ...
- MySQL数据库学习导航
MySQL数据库学习导航 MySQL数据库基础知识 MySQL数据库备份 MySQL数据在线备份 MySQL数据库基础知识 MySQL数据库介绍 MySQL体系结构 MySQL语句 - sql语句 M ...
- MySQL 数据库学习(一)
MySQL 数据库学习 数据库 1. 数据库的介绍 2. 数据库的分类 3. 数据库的作用 4. 数据库的特点 5. 小结 MySQL数据库 1. MySQL数据库的介绍 2. MySQL数据库的安装 ...
最新文章
- [翻译]ASP.NET MVC 3 开发的20个秘诀(十二)[20 Recipes for Programming MVC 3]:缩放图片尺寸创建缩略图...
- 这里有个自学数据分析并拿到大厂offer的文科小姐姐
- Git在服务器安装完成后续工作
- shell脚本-页面静态化
- 数据结构笔记--栈的总结及java数组实现简单栈结构
- 金三银四的面试黄金季节,Android面试题来了!
- 自定义Writable类型
- C语言显示系统时间的几个办法
- android 第三方裁剪,Android裁剪意向不适用于系统图库应用程序,但适用于第三方应用程序...
- 二十二、K8s集群设置4-网络策略与校验和
- excel 未能加载文件或程序集 officetoolbar_JavaScript数据透视表dhtmlxPivot,帮助您方便快捷的汇总大型数据集...
- c语言for循环延时函数作用,C语言循环语句实现单片机延时函数.pdf
- Linux版本的SVN客户端,好的Linux(Ubuntu)SVN客户端
- 诺奖得主、院士,全职加盟国内211大学!
- win7设置计算机共享的打印机共享的打印机共享,告诉你win7打印机共享设置教程...
- 高频交易及化资策与区
- cannot find -lxxx 问题的总结
- 网络营销十大要点秒懂
- 12306系统架构,凭什么支撑每天如洪水般的各种抢票插件?
- matlab抗饱和 符号,MATLAB作图特殊符号大全
热门文章
- B. super_log(2019ICPC区域网络赛南京站)
- 不会还有人不会配置LLDP链路层发现协议吧?
- mysql帖子排序_mysql - 无法按元值对帖子排序 - SO中文参考 - www.soinside.com
- 云计算运维累不累_关于云计算运维管理要点的知识分享
- CNCF 官方大使张磊:Kubernetes 是一个“数据库”吗?
- Charles的功能操作
- java mysql blob 存储图片,Java实现用Mysql存取图片操作实例
- 大学不挂科c语言题库及答案,C语言期末总复习,保你不挂科!
- 1977标准_超过8分,就是痛风!附痛风诊断新标准和治疗原则
- mysql php gpl_MySQL_MySQL数据库远程访问权限如何打开(两种方法),下载GPL版本安装MySQL Community - phpStudy...