MySQL存储过程和函数的操作(十二)


本文整理自网络,侵删。

数据库对象表时存储和操作数据的逻辑结构,而数据库对象存储过程和函数,则是用来实现将一组关于表操作的sql语句当作一个整体来执行。在数据库系统中,当调用存储过程和函数时,则会执行这些对象中所设置的sql语句组,从而实现相应功能。
1. 为什么使用存储过程和函数的操作 
    有时针对表的一个完整操作往往不是单条sql语句就可以实现的,而是需要一组sql语句来实现。在具体应用当中,一个完整的操作会包含多条sql语句,在执行过程中需要根据前面sql语句的执行结果有选择地执行后面sql语句。
    存储过程和函数可以简单理解为一条或多条sql语句的集合。存储过程和函数就是事先经过编译并存储在数据库中的一段sql语句集合。
    存储过程和函数有什么区别呢?这两者的主要区别在于函数必须有返回值,而存储过程则没有。存储过程的参数类型远远多于函数的参数类型。 

关于存储过程和函数的优点如下:
      1. 存储过程和函数允许标准组件式编程,提高了sql语句的重用性、共享性和可移植性。
      2. 存储过程和函数能够实现较快的执行速度,能够减少网络流量。
      3. 存储过程和函数可以作为一种安全机制来利用。 

关于存储过程和函数的缺点如下:
      1. 存储过程和函数的编写比单句sql语句复杂,需要用户有更高的技能和更丰富的经验。
      2. 在编写存储过程和函数时,需要创建这些数据库对象的权限。=

2. 创建存储过程和函数 
2.1 创建存储过程语法形式:

语法形式如下:

create procedure procedure_name([procedure_parameter[,...]])
  [characteristic...] routine_body

//说明:procedure_name参数表示所要创建的存储过程的名字,procedure_parameter参数表示存储过程的参数,
characteristic参数表示存储过程的特性,routine_body参数表示存储过程的sql语句代码,可以用begin...end来标志sql语句的开始和结束。
//注意:在具体创建存储过程时,存储过程名不能和已经存在的存储过程名重复,推荐存储过程名为procedure_xxx或者proce_xxx;

//procedure_parameter 中每个参数的语法形式为:
[IN|OUT|INOUT] parameter_name type

//该语句中每个参数由三部分组成,分别为输入/输出类型、参数名和参数类型。

characteristic参数的取值为:
language sql
|[not] deterministic
|{constains sql | no sql | reads sql data|modifies sql data}
|sql security {definer | invoker}
|comment 'string'

    1. language sql,表示存储过程的routine_body部分由sql语言的语句组成。为mysql软件所有默认的语句。
    2. [not] deterministic,表示存储过程的执行结果是否确定。如果值是deterministic表示执行结果是确定的。即每次执行存储过程时,如果输入相同的参数将得到相同的输出;如果值为not deterministic,表示执行结果不确定,即相同的输入可能得到不同的输出。默认值为deterministic。
    3. {contains sql|no sql|reads sql data|modifies sql data},表示sql语句的限制,如果值为contains sql表示可以包含sql语句,但不包含读或写数据的语句;如果值为no sql表示不包含sql语句;如果值为reads sql data表示包含读数据的语句;如果值为modifies sql data表示包含读数据的语句。默认值为contains sql。
    4. sql security{definer|invoker},设置谁有权限来执行。如果值为definer,表示只有定义者才能执行,如果值为invoker表示调用者可以执行。默认值为definer。
    5. comment ‘string', 表示注释语句。 

2.2 创建函数语法形式:

语法形式如下:

create function function_name([function_parameter[,...]])
  [characteristic...] routine_body

    上述语句中,function_name参数表示所要创建的函数的名字;function_parameter参数表示函数的参数,characteristic参数表示函数的特性,该参数的取值与存储过程中的取值相同。routine_body参数表示函数的sql语句代码,可以用begin…end来表示sql语句的开始和结束。

function_parameter中每个参数的语法形式如下:
parameter_name type

    在上述语句中每个参数由两部分组成,分别为参数名和参数类型。parameter_name表示参数名。type表示参数类型。 

2.3 创建简单的存储过程和函数:

//查询雇员表中所有雇员工资的存储过程:
示例:

mysql> delimiter $$
mysql> delimiter $$ create procedure proce_employee_sal() 
    comment '查询所有雇员的工资' 
    begin 
     select sal from t_employee;
    end $$
    dilimiter ;

    通常在创建存储过程时,通过命令delimiter && 将sql语句的结束符由“;”符号修改成两个美元符号。这主要是因为sql语句中默认语句结束符为分好(;),即存储过程中的sql语句也需要用分号来结束,将结束符号修改成两个美元符之后,就可以在执行过程中避免冲突。不过最后不要忘记将通过命令“delimiter ;”将结束符修改为sql语句中默认的结束符号。

创建函数示例:

delimiter $$
create function func_employee_sal (empno int(11))
 returns double(10,2)
 comment '查询某个雇员的工资'
 begin
 return (
  select sal from t_employee where t_employee.empno=empno;
 )
end$$
delimiter ;

    创建了一个名为func_employee_sal的函数,该函数拥有一个类型为int(11),名为empno的参数,返回值为double(10,2)类型。select语句从t_employee表中查询empnoo字段值等于所传入参数empno值的记录,同时将该条记录的sal字段的值返回。

3. 关于存储过程和函数的表达式 

3.1 操作变量:
    变量是表达式语句中最基本的元素,可以用来临时存储数据。可以通过变量存储从表中查询到的数据。 

    3.1.1 声明变量:

语法形式如下:
declare var_name[,...] type [default value]

阅读剩余部分

相关阅读 >>

详解mysql8.0​ 字典表增强

如何修改mysql登录权限

mysql免安装版配置步骤详解分享

mysql数据库四种事务隔离级别的介绍

mysql中mydumper 和 mysqldump对比使用详解

mysql 5.5 range分区增加删除处理实例详解

mac如何开启mysql bin-log

mysql 慢查询日志深入理解

mysql 出现1267错误怎么办

mysql高级知识之 架构介绍

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...