关于mysql数据库的存储过程

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在例程定义中命名为的帐户 不同。

猜你喜欢

转载自blog.csdn.net/bianb123/article/details/81976010