CREATE
[DEFINER = user]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
CREATE
[DEFINER = 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
这些语句创建存储的例程。默认情况下,例程与默认数据库关联。要将例程与给定数据库明确关联,请在创建例程db_name.sp_name时指定名称 。
要调用存储过程,请使用 CALL语句(请参见 第13.2.1节“ CALL语句”)。要调用存储的函数,请在表达式中引用它。该函数在表达式求值期间返回一个值。
CREATE PROCEDURE和CREATE FUNCTION需要CREATE ROUTINE权限。如果存在DEFINER子句,则所需的权限取决于用户值。如果启用了二进制日志记录,则CREATE函数可能需要超级权限,如第24.7节“存储程序二进制日志记录”中所述。
默认情况下,MySQL会自动将ALTER例程和EXECUTE特权授予例程创建者。此行为可以通过禁用automatic_sp_privileges系统变量来更改。
DEFINER和SQL SECURITY子句指定在例程执行时检查访问权限时要使用的安全上下文,如本节后面所述。
如果例程名称与内置SQL函数的名称相同,则会发生语法错误,除非在定义例程或稍后调用该例程时在名称和以下括号之间使用空格。因此,请避免将现有SQL函数的名称用于您自己的存储例程。
忽略空间SQL模式适用于内置函数,而不是存储例程。不管是否启用了忽略空间,存储的例程名称后面始终允许有空格。
括号内的参数列表必须始终存在。如果没有参数,则应使用空的参数列表。参数名不区分大小写。
默认情况下,每个参数都是IN参数。若要为参数指定其他值,请在参数名称之前使用关键字OUT或INOUT。
注意
将参数指定为IN、OUT或INOUT仅对过程有效。对于一个函数,参数总是被视为参数中的参数。