源无极

导航

 

一、定义

完成特定功能的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

 

 

执行删除

 

 成功删除

 

posted on 2019-10-06 22:41  源无极  阅读(207)  评论(0编辑  收藏  举报