一:什么是存储过程?
存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理。
二:创建存储过程和函数
MySQL中创建存储过程和函数分别使用CREATE PROCEDURE和CREATE FUNCTION
使用CALL语句来调用存储过程,存储过程也可以调用其他存储过程
函数可以从语句外调用,能返回标量值
1:创建存储过程
语法:
proc_parameter指定存储过程的参数列表,列表形式如下:
其中in表示输入参数,out表示输出参数,inout表示既可以输入也可以输出;param_name表示参数名称;type表示参数的类型
该类型可以是MYSQL数据库中的任意类型
characteristics指定存储过程的特性,有以下取值:
LANGUAGE SQL :说明routine_body部分是由SQL语句组成的,当前系统支持的语言为SQL,SQL是LANGUAGE特性的唯一值
[NOT] DETERMINISTIC :指明存储过程执行的结果是否正确。DETERMINISTIC 表示结果是确定的。每次执行存储过程时,相同的输入会得到相同的输出。[NOT] DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的输出。如果没有指定任意一个值,默认为[NOT] DETERMINISTIC
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
SQL SECURITY { DEFINER | INVOKER } :指明谁有权限来执行。DEFINER 表示只有定义者才能执行
INVOKER 表示拥有权限的调用者可以执行。默认情况下,系统指定为DEFINER
COMMENT 'string' :注释信息,可以用来描述存储过程或函数
routine_body是SQL代码的内容,可以用BEGIN...END来表示SQL代码的开始和结束
创建一个查询student表全部数据的存储过程
这里的逻辑是
1、创建Proc() 存储过程
2、执行Proc() 存储过程
创建名为CountProc的存储过程,代码如下:
上面代码的作用是创建一个获取stu_info表记录数的存储过程,名称是CountProc,
COUNT(*)计算后把结果放入参数param1中。
2:创建存储函数
语法:
CREATE FUNCTION为用来创建存储函数的关键字;func_name表示存储函数的名称
func_parameter为存储函数的参数列表,参数列表如下:
其中,IN表示输入参数,OUT表示输出参数,INOUT表示既可以输入也可以输出;
param_name表示参数名称;type表示参数类型,该类型可以是MYSQL数据库中的任意类型
RETURNS TYPE语句表示函数返回数据的类型;characteristics:指定存储函数的特性,取值与创建存储过程时相同
创建存储函数,名称为addr_func,该函数返回SELECT语句的查询结果,数值类型为字符串型
调用函数:
如果在存储函数中的RETURN语句返回一个类型不同于函数的RETURNS子句中指定类型的值,返回值将被强制转换为恰当的类型。
例如,如果一个函数返回一个SET或ENUM值,但是RETURN语句返回一个整数,对于SET成员集的相应ENUM成员,从函数返回的值是字符串。