创建存储过程
CREATE
[DEFINER = { user | CURRENT_USER }]
PROCEDURE sp_name ([proc_parameter[,...]])
[characteristic ...] routine_body
proc_parameter:
[ IN | OUT | INOUT ] param_name 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
[begin_label:] BEGIN
[statement_list]
……
END [end_label]
IN、OUT、INOUT 三种参数
IN 输入参数:
表示该参数的值必须在调用存储过程时指定,在存储过程中修改该参数的值不能被返回,为默认值
OUT 输出参数:
该值可在存储过程内部被改变,并可返回
INOUT 输入输出参数:
调用时指定,并且可被改变和返回
简化
CREATE
PROCEDURE sp_name([[IN |OUT |INOUT ] 参数名 数据类形...])
BEGIN
routine_body
END
DELIMITER // 或 DELIMITER ; 为修改分割符
MYSQL默认分割符为; 若不声明编译器会当成SQL处理,则编译报错。
事先修改分割符使编译存储过程成功。并在事后还原分割符
注: 若使用mysql管理工具可以不需要声明分割符
调用存储函数
call sp_name([proc_parameter[,...]])
示例
DELIMITER //
CREATE PROCEDURE proc(IN a int)
BEGIN
SELECT a;
SET a=10;
SELECT a;
END//
DELIMITER ;
#调用
set @a = 1;
call proc(@a)
存储过程查询
select ROUTINE_NAME,ROUTINE_TYPE from mysql.proc where db='数据库名';
或者
select ROUTINE_NAME,ROUTINE_TYPE from information_schema.routines where routine_schema='数据库名';
或者
show procedure status where db='数据库名';