mysql5.7建立存储过程和建立函数的语法

mysql5.7建立存储过程和建立函数的语法

创建存储过程默认情况下一个过程会有一个默认的数据库。创建存储过程时指定名的格式为:db_name.sp_name,sp_name就是过程名,db_name就是过程应用到的数据库名。

调用存储过程需要使用CALL语句。

CREATE PROCEDURE和CREATE FUNCTION需要CREATE ROUTINE权限或SUPER权限,这依赖于DEFINER的值。如果开启了bin logCREATE FUNCTION可能需要SUPER权限。

默认MYSQL自动授予ALTER ROUTINE 和EXECUTE权限到过程的创建者上。这个行为可以通过关闭automatic_sp_privileges系统变量来屏蔽。

DEFINER和SQL SECURITY子句指定了存储过程的安全内容,当过程执行期间检查访问权限时被使用。

如果routine名和SQL内建函数同名,会发生语法错误。

参数列表必提供,即使没有参数也要有一个空的参数列表。参数名忽略大小写。

参数默认是IN参数,如果要指定其它类型在参数名前写上OUT或INOUT。(OUT和INOUT只对过程有用,FUNCTION只有IN参数)

IN参数传值到过程里。过程可以修改这个值,但是当过程返回时修改对调用者不可见。OUT参数从过程传值返回给调用者。它在过程中的初始值是NULL,并且它的值是在过程返回时对调用者是可见的。INOUT参数由调用者初始化,能被过程修改,并且任何在过程中的修改,对调用者是可见的。

每一个OUT或INOUT参数,传递用户定义变量在CALL语句中,当过程返回时可以获得它的值。同样可以在其它routine中调用另一个routine。

CREATE
    [DEFINER = { user | CURRENT_USER }]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = { user | CURRENT_USER }]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

func_parameter:
    param_name type

type:
    Any valid MySQL data type

characteristic:
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }

routine_body:
    Valid SQL routine statement

存储过程的例子:

mysql> delimiter //

mysql> CREATE PROCEDURE simpleproc (OUT param1 INT)
    -> BEGIN
    ->   SELECT COUNT(*) INTO param1 FROM t;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;

mysql> CALL simpleproc(@a);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @a;
+------+
| @a   |
+------+
| 3    |
+------+
1 row in set (0.00 sec)

 

发表回复