1、存储过程:定义存储的程序
每个存储的程序都包含一个由SQL语句组成的主体。该语句可以是由以分号(;
)字符分隔的多个语句组成的复合语句。
默认情况下,mysql本身将分号识别为语句分隔符,因此必须使用 delimiter
命令,临时重新定义分隔符,以使mysql将整个存储的程序定义传递给服务器。
存储过程的主体由一个BEGIN ... END
包含SET
语句的块 和一个REPEAT
本身包含另一个SET
语句的循环组成 ,比如:
/* 重新定义分隔符为// */
mysql> delimiter //
mysql> CREATE PROCEDURE dorepeat(p1 INT)
-> BEGIN
-> SET @x = 0;
-> REPEAT SET @x = @x + 1; UNTIL @x > p1 END REPEAT;
-> END
-> //
Query OK, 0 rows affected (0.00 sec)
/* 还原为默认分隔符; */
mysql> delimiter ;
mysql> CALL dorepeat(1000);
2、存储过程的创建、修改、删除、调用
创建:CREATE PROCEDURE 修改:ALTER PROCEDURE
删除:DROP PROCEDURE 调用 :CALL proc_name ([参数....])
CREATE [DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
关于存储过程的权限
[DEFINER = { user | CURRENT_USER }]创建存储过程的时候可以指定 SQL SECURITY属性,设置为 DEFINER 或者INVOKER,用来告知mysql在执行存储过程的时候,是以DEFINER用户的权限来执行,还是以调用者的权限来执行。
默认情况下,使用DEFINER方式,此时调用存储过程的用户必须有存储过程的EXECUTE权限,并且DEFINER指定的用户必须是在mysql.user表中存在的用户。DEFINER模式下,默认DEFINER=CURRENT_USER,在存储过程执行时,mysql会检查DEFINER定义的用户'user_name'@'host_name'的权限;
INVOKER模式下,在存储过程执行时,会检查存储过程调用者的权限。
关于存储过程的参数
proc_parameter: [ IN | OUT | INOUT ] param_name type 参数有三种IN、OUT、INOUT类型
in 是参数的默认模式,这种模式就是在程序运行的时候已经具有值,在程序体中值不会改变
out模式定义的参数只能在过程体内部赋值,表示该参数可以将某个值传递回调用他的过程
inout 表示高参数可以向该过程中传递值,也可以将某个值传出去
存储过程是与数据库关联的。若要将例程与给定数据库显式关联,可以db_name.sp_name
在创建时指定名称
在删除一个数据库的时候,会自动将相关的例程一起删除。
3、存储过程的相关权限
-
将
CREATE ROUTINE
需要的权限来创建存储例程。 -
在
ALTER ROUTINE
需要的权限更改或删除保存的程序。如有必要,此权限将自动授予例程的创建者,并在例程被删除时从创建者中删除。 -
EXECUTE
执行存储例程需要该特权。但是,如果需要,此特权将自动授予例程的创建者(并在例程被删除时从创建者中删除)。此外,SQL SECURITY
例程的默认特征是DEFINER
,允许访问与例程关联的数据库的用户执行例程。 -
如果
automatic_sp_privileges
系统变量为0,EXECUTE
并且ALTER ROUTINE
权限不会自动授予,并从日常的创造者下降。 -
例程的创建者是用于为其执行
CREATE
语句的帐户 。这可能与DEFINER
在例程定义中命名为的帐户 不同。