一、定义
完成特定功能的SQL语句集合,将常用或是复杂的工作预先用SQL语句写好,并用一个特定名称存储起来,
这个过程经编译和优化后存储在数据库服务器中,因此称为存储过程。以后需要数据库提供与已定义好的存储过程的
功能相同的服务时,只需要调用“”CALL“ 存储过程名字即可自动完成。
二、创建存储过程
创建存储过程需要使用CREATE PROCEDURE 基本语法如下
CREATE PROCEDURE sp_name( [proc_parameter])
[characteristic...] routine_body
CREATE PROCEDURE:是用来创建存储函数的关键字,
sp_name:存储过程名称
proc_parameter:指定存储过程的参数列表,列表如下
[ IN | OUT | INOUT ] param_name type
其中,IN是输入参数,out是输出参数 ,INOUT是即可输入也可输出,param_name 是参数名称,type是参数类型。
characteristic:指定存储过程的特性,有以下取值。
1)LANGUAGE SQL :说明routine_body部分是由SQ语句组成的,sql是LANGUAGE 特性的唯一值。
2)[ NOT ] DETERMINISTIC :指明存储过程执行的结果是否正确。DETERMINISTIC 表示结果是确定的,当执行存储过程时,
相同的输入会得到相同的输出。NOT DETERMINISTIC 表示结果是不确定的,相同的输入可能得到不同的结果,如果没有指定任意一个值,
默认为NOT 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 ' :注释信息,可以用来描述存储过程或是函数,
routine_body是SQL代码的内容,可以用BEGIN....END 来表示SQL代码的开始和结束。
存储过程可能需要复杂的SQL,并且需要创建存储过程的权限。但是使用存储过程将简化操作,减少冗余的操作,
还可以减少操作过程的失误,提高效率。
案例一:创建学生表 did(班级编号)
1.创建查看student表的存储过程
2.创建名为CountStu的存储过程。
说明:将查到的count(*) 结果放入到参数po,最终这个过程名称输出po也就是count(*)
三、调用存储过程
调用的语法:
CALL sp_name([ parameter [ ,...] ])
parameter 是存储过程的参数
1. 查询上面创建的
2.
3. 创建存储过程来查询某一个班级的平均年龄
四、查看存储过程
三个方法
1. 语法1
SHOW PROCEDURE STATUS [ LIKE 'pattern']
这是mysql的一个扩展,它返回存储过程的特征,例如所属数据库、名称、类型、创建者、创建、修改时间。
如果没有指定样式,根据使用的语句,所有存储过程被列出。LIKE语句表示匹配存储过程的名称
1)所有存储过程被列出
2) 查询a开头的存储名称
2. 语法2
SHOW CREATE PROCEDURE sp_name
3.语法3:通过information_schema.Routines查看存储过程信息
information_schema是信息数据库,其中保存了MYSQL服务器维护的所有其他数据库的相关信息。
该数据库中的Routines表提供存储过程的信息。通过查询该表可以查询相关存储过程的信息。语法
SELECT * from information_schema.ROUTINES
WHERE ROUTINE_NAME='spname';
例子 :从information_schema.Routines表中查询存储过程为avg_student的信息
五、修改存储过程
修改存储过程的语法如下
ALTER { PROCEDURE | FUNCTION } sp_name [ characteristic... ]
sp_name :待修改的存储过程名称
characteristic:用来指定特性,可能取值如下
{CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA}
| SQL SECURITY { DEFINER | INVOKER }
| COMMENT ‘string’
说明:
CONTAINS SQL: 是表明存储过程包含SQL语句,但是不包含读或是写数据的语句
NO SQL:表明存储过程不包含SQL语句
READS SQL DATA: 表明存储过程包含读数据的语句
MODIFIES SQL DATA:表明存储过程包含写数据的语句
DEFINER 表明只有定义者才有执行
INVOKER :表明调用者可以执行。默认情况下指定为DEFINER 。
案例:修改存储过程avg_student的定义,将读写权限修改为MODIFIES SQL DATA ,并指明调用者可以执行。
先查看修改前的信息
修改
修改之后查看
结果可知:访问数据库的权限变成MODIFIES SQL DATA,安全类型变成 INVOKER
六、删除存储过程
语法
DROP PROCEDURE sp_name
案例删除存储过程名称为Pro_student
执行删除
成功删除