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)