1 创建存储过程和函数
创建存储过程和函数的create语法规范如下:
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 ##输入参数,由于其输出参与已经在return中声明,不需要再指定
type:
Any valid MySQL data type
characteristic:
COMMENT 'string'
| LANGUAGE SQL
| [NOT] DETERMINISTIC ##默认为NOT DTERMINISTIC
| { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
| SQL SECURITY { DEFINER | INVOKER }
routine_body:
Valid SQL routine statement
如果没有声明[NOT] DETERMINISTIC选项,则mysql默认的选项为NOT DETERMINISTIC,意味着mysql针对DETERMINISTIC的优化器不会开启。因此这个选项需要特别注意的写上。
但是仅有create语句是不够的,一般创建过程和函数有一下3个步骤:
a 修改delimiter
b create语句+begin...end语句 作为存储过程和函数的主体部分
c 恢复原有的delimiter
如 官方文档中创建存储过程的实例:
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> delimiter //
mysql> CREATE FUNCTION hello (s CHAR(20))
mysql> RETURNS CHAR(50) DETERMINISTIC
-> RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
2 调用方法
CALL sp_name([parameter[,...]])
CALL sp_name[()]
3 查看状态
SHOW {PROCEDURE | FUNCTION} STATUS [LIKE 'pattern']
或者:
SHOW CREATE {PROCEDURE | FUNCTION} sp_name
或者从information_schema.Routines表中查看
SELECT * FROM information_schema.Routines WHERE ROUTINE_NAME=' sp_name ' ;
4 修改
ALTER {PROCEDURE | FUNCTION} sp_name [characteristic ...]
5 删除
DROP {PROCEDURE | FUNCTION} [IF EXISTS] sp_name
6 过程和函数的好处
可以参见博文利用mysql的存储过程比单独执行mysql的优势在哪里?好处有什么?
简单说起来主要是:可复用,高效率,省流量,更安全。