MySQL存储过程
存储过程
定义存储过程
delimiter ;;create procedure get_user_count()begin select count(*) as user_count from sys_user;end;;delimiter;
关于分隔符
MySQL语句分隔符为;
,MySQL命令行程序也使用;
作为语句分隔符。如果通过命令行执行存储过程会解释存储过程自身内的;
字符,会使存储过程中的SQL出现语法错误。
调用存储过程
call get_user_count();
删除存储过程
drop procedure get_user_count;
使用参数
参数中有out
-- 使用参数-- in 传递到存储过程-- out 从存储过程传出-- inout 对存储过程传入和传出delimiter ;;create procedure get_count( out user_count int(10), out role_count int(10), out dict_count int(10))begin select count(*) into user_count from sys_user; select count(*) into role_count from sys_role; select count(*) into dict_count from sys_dict;end;;delimiter ;-- 调用-- 所有MySQL变量都必须以@开始-- 不能通过一个参数返回多个行和列call get_count(@user_count, @role_count, @dict_count);select @user_count, @role_count, @dict_count;
参数中有in有out
drop procedure if exists get_user_by_name;delimiter ;;create procedure get_user_by_name( in user_name varchar(45), out user_id int(10))begin select id from sys_user where user_name = user_name limit 1 into user_id;end;;delimiter ;-- 调用call get_user_by_name('admin', @admin_id);select @admin_id;
复杂一点的
-- comment 给存储过程加注释-- 定义delimiter ;;create procedure insert_user( in userName varchar(50), in defaultPass boolean, out userId int) comment 'create user'begin declare pass varchar(50) default null; if defaultPass then set pass = '123456'; end if; insert into sys_user(user_name, user_password, create_time) values (userName, pass, now()); select LAST_INSERT_ID() into userId;end;;delimiter ;-- 调用call insert_user('张三', false, @userId1);call insert_user('李四', true, @userId2);select @userId1, @userId2;select id, user_name, user_password, create_time from sys_user;