文章目录
创建存储过程
基本语法如下:
create procedure sp_name ( [proc_parameter]) [characteristics ... ] routine_body
(1)create procedure 用来创建存储过程的关键字。
(2)sp_name 为存储过程的名称
(3) proc_parameter 为存储过程的参数列表,列表形式如下:
[in |out |inout] param_name type
in为输入参数,out为输出参数;inout为既可以输入也可以输出参数;param_name 为参数名称 type为参数的类型,可以是mysql的参数的任意类型。
(4) characteristics 指定存储过程的特征,取值较多。
LANGUAGE SQL
存储过程语言,默认是sql,说明存储过程中使用的是sql语言编写的,暂时只支持sql,后续可能会支持其他语言
NOT DETERMINISTIC
是否确定性的输入就是确定性的输出,默认是NOT DETERMINISTIC,只对于同样的输入,输出也是一样的,当前这个值还没有使用
CONTAINS SQL
提供子程序使用数据的内在信息,这些特征值目前提供给服务器,并没有根据这些特征值来约束过程实际使用数据的情况,说白了就是没有使用的
包括以下四种选择
1.CONTAINS SQL表示子程序不包含读或者写数据的语句
2.NO SQL 表示子程序不包含sql
3.READS SQL DATA 表示子程序包含读数据的语句,但是不包含写数据的语句
4.MODIFIES SQL DATA 表示子程序包含写数据的语句。
SQL SECURITY DEFINER
用来指定存储过程是使用创建者的许可来执行,还是执行者的许可来执行,默认值是DEFINER
DEFINER 创建者的身份来调用,对于当前用户来说:如果执行存储过程的权限,且创建者有访问表的权限,当前用户可以成功执行过程的调用的
说白了就是当前用户调用存储过程,存储过程执行的具体操作是借助定义存储过程的user的权限执行的。
INVOKER 调用者的身份来执行,对于当前用户来说:如果执行存储过程的权限,以当前身份去访问表,如果当前身份没有访问表的权限,即便是有执行过程的权限,仍然是无法成功执行过程的调用的。
说白了就是当前用户调用存储过程,只有当前用户有执行存储过程中涉及的对象的操作的权限的时候,才能成功执行。
COMMENT 'string'
存储过程的注释性信息写在COMMENT里面,这里只能是单行文本,多行文本会被移除到回车换行等
(5) routine_body 是SQL的代码部分,用begin和end来代表开始和结束。
例如创建名为 checksttu()的存储函数
delimiter //
> create procedure checksttu()
> begin
> select avg(grade) as avggrade from sc;
> end //
deliliter
语句用来确认结束符,由于sql语句用分号来结尾,创建存储过程时有sql语句,分号来结尾会和创建过程的结束冲突,所以需要改变结束符的方式。
创建存储函数
crate function func_name( [func_parameter]) returns type [characteristic ...] routine_body
returns type 是函数返回的数据类型,characteristic和存储过程的一样。
例如:
> delimiter //
> create function Sumer()
> returns int(11)
> return (select sum(grade) from sc where sno='201708034101');
> //
定义变量
declare var_name[,varname] ... data ...type [default value];
用set语句为变量赋值
例如:
declare var1,var2,var3 INT;
set var1=10,var2=20;
set var3=var1+var2;
也可以用select...into
语句进行赋值
select col_name[,...] into var_name[,...] table_expr
declare fruit_name char(50);
declare fruit_price decimal(8,2);
select f_name,f_price into fruitname,fruiitprice
from fruits f_id='a1'
定义条件和处理程序
定义条件是实现定义程序执行过程中遇到的问题,处理程序遇到这些问题的处理方式,并且保证存储过程或函数在遇到警告或者错误的时候能正常的执行,增强程序处理错误的能力。
1.定义条件
DECLARE condition_name CONDITION FOR [condition_type]
[contion_type] :
SQLSTATE [VALUE] sqlstate_value| mysql_error_code
[condition_type为条件的类型,sqlstate_value 为长度为5的字符串类型的错误代码,mysql_error_code 为数值类型的错误代码。
语句用来指定需要特殊处理的条件 ,可以将一个名字和指定的错误关联起来 ,这个名字可以直接用到处理程序中。
例如:
declare command_not_allowed CONDITION FOR SQLSTATE '