设为首页 加入收藏

TOP

MySQL数据库之存储过程与存储函数(一)
2018-12-24 00:08:44 】 浏览:262
Tags:MySQL 数据库 存储 过程 函数

        存储过程和存储函数类似于面向对象程序设计语言中的方法,可以简化代码,提高代码的重用性。本文主要介绍如何创建存储过程和存储函数,以及存储过程与函数的使用、修改、删除等操作。


    MySQL中提供存储过程与存储函数机制,我们姑且将存储过程和存储函数合称为存储程序。与一般的SQL语句需要先编译然后立即执行不同,存储程序是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,当用户通过指定存储程序的名字并给定参数(如果该存储程序带有参数)来调用才会执行。


  存储程序就是一条或者多条SQL语句和控制语句的集合,我们可以将其看作MySQL的批处理文件,当然,其作用不仅限于批处理。当想要在不同的应用程序或平台上执行相同的功能一段程序或者封装特定功能时,存储程序是非常有用的。数据库中的存储程序可以看做是面向对编程中面向对象方法,它允许控制数据的访问方式。


  存储函数与存储过程有如下区别:


  (1)存储函数的限制比较多,例如不能用临时表,只能用表变量,而存储过程的限制较少,存储过程的实现功能要复杂些,而函数的实现功能针对性比较强。


  (2)返回值不同。存储函数必须有返回值,且仅返回一个结果值;存储过程可以没有返回值,但是能返回结果集(out,inout)。


  (3)调用时的不同。存储函数嵌入在SQL中使用,可以在select 存储函数名(变量值);存储过程通过call语句调用 call 存储过程名。


  (4)参数的不同。存储函数的参数类型类似于IN参数,没有类似于OUT和INOUT的参数。存储过程的参数类型有三种,IN、out和INOUT:


    a. in:数据只是从外部传入内部使用(值传递),可以是数值也可以是变量


    b. out:只允许过程内部使用(不用外部数据),给外部使用的(引用传递:外部的数据会被先清空才会进入到内部),只能是变量


    c. inout:外部可以在内部使用,内部修改的也可以给外部使用,典型的引用 传递,只能传递变量。


  创建存储过程语法结构如下:


        CREATE PROCEDURE是用来创建存储过程的关键字;[IN|OUT|INOUT]是参数的输入输出类型,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;过程体是包含若干SQL语句或流程控制语句的集合,可以用BEGIN…END来包裹。


        在演示如果创建存储过程之前(emp表、dept表),先创建两个数据表,本文所有演示操作都基于这两个表来进行,创建表与插入数据SQL语句如下:


  emp表:


    


  dept表:


  


  建好表后,我们来创建一个存储过程。


  示例1:通过存储过程完成查询每个员工编号(empno)、姓名(ename)、职位(job)、领导编号(mgr)、领导姓名(empno)、部门名称(dname)、部门位置(loc)。


  注:“delimiter //”语句的作用是将MySQL的结束符设置为//,因为MySQL默认的语句结束符是分号“;”,为了避免与存储过程中的SQL语句结束符相冲突,需要使用delimiter改变存储过程的结束符,设置为以“end //”结束存储过程。存储过程定义完毕之后,再使用“delimiter;”回复默认结束符。delimiter也可以指定其他符号作为结束符(“\”除外,这是转义字符)。当然,如果你在Navicat等图形界面下进行,可以不用设置delimiter。


  示例1中SQL语句创建了一个名为select_pro的存储过程,通过“call select_pro()”,即可完成查询功能,不在需要每次查询都重写查询语句。


  示例2:创建一个带参数的存储过程,删除emp表中empno为指定值得记录,并返回最高最高月薪,也返回大于指定月薪的人数。


  调用上面创建好的存储过程param_pro:


   查看emp表,也发现empno为7369的记录确实被删除。


  将查询结果赋值给变量时,可以使用into关键字,既可以在select子句末尾写into关键字,也可以在值后面写into语句。


  语法结构如下:


  存储过程与存储函数一个很大的不同就是制定参数IN、OUT、INOUT只对存储过程有用,存储函数默认IN类型参数,不能设置其他两种类型。RETURNS子句声明返回值类型也只能在存储函数中使用,且一个存储函数必须包含一个RETURNS 语句。


  示例3:用存储函数查询指定empno的员工的月薪sal


  调用存储函数fun1:


  输出结果如下:


   


  使用ALTER语句可以修改存储过程和函数的特性。语法结构如下:


  其中,sp_name表示存储过程或函数的名称,characteristic参数指定存储过程或函数的特性,可能取值有:


  CONTAINS SQL:子程序包含SQL语句,但不包含读或写数据的语句。


  NO SQL:子程序不包含SQL语句。


  READS SQL DATA:子程序包含读数据的语句。


  MODIFIES SQL DATA:子程序包含写数据的语句。


  SQL SECURITY { DEFINER | INVOKER}:指明谁有权限执行。


  DEFINER:只有定义者自己才能执行。


  INVOKER:调用者可以执行。


  COMMENT ‘string’ :注释。


  示例4:示例1中创建的存储过程param_pro,将其读写权限该为MODIFIES SQL DATA,并指明调用者可以执行。


  MySQL中用来构造流程控制语句的有:IF语句、CASE语句、LOOP语句、LEAVE语句、ITERATE语句、REPEAT语句和WHILE语句。每一个流程中可能包含一个单独的语句,或者是使用BEGIN…END构造复杂语句,构造可以被嵌套。


  (1)IF语句


  IF语句包含多个条件判断,根据判断结果为TRUE或FALSE来执行相应的语句,语法格式如下:


  注意:所以IF语句都需要用END IF来结束,在THEN中执行,ELSEIF和ELSE是可选的。


  示例5:有一个变量val,判断变量值是否为空,若为空,输出“val is NULL”;否则输出“val is not NULL”。


  (2)CASE语句


  CASE是另一种条件判断语句,该语句有两种格式,第一种格式如下:


  参数说明:


  case_expr,表示条件判断的表达式,决定了哪一个WHEN自己会被执行


  When_value,表示表达式可能的值,如果,某个when_value表达式与case_expr表达式结果相同,则执行对应THEN关键字后的statement中的语句


  Statement_list,表示不同when_value值的执行语句


   示例6:使用CASE流程控制语句的第一种格式,判断val值,若等于1则输出‘val is 1’ , 若等于2则输出‘val is 2’,或者两者都不等于则输出‘val is not 1 or 2’:


  CASE语句的第二种格式:


  示例7:使用CASE流程控制语句的第二种格式判断变量val是否为空,小于零、大于零、等于零,并作对应的输出:


  注意,这里存储过程中的CASE语句,与控制流程函数中的SQL CASE表达式中的CASE是不同的,存储过程中,CASE语句不能有ELSE NULL子句,并且用END CASE代替END来终止。


  (3) LOOP语句与LEAVE语句


   LOOP语句循环语句用来重复执行某些语句,与IF和CA

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Redis数据类型与常用操作详解 下一篇MySQL数据库之视图

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目