mysql存储过程使用教程【1】

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_26584263/article/details/82116667

1.新建一个数据库,在数据库里面新建一张user表 

新建数据表的语句是:

CREATE TABLE `user` (
  `user_id` bigint(20) NOT NULL,
  `user_name` varchar(20) DEFAULT NULL,
  `user_age` int(11) DEFAULT NULL,
  `user_password` varchar(20) DEFAULT NULL,
  `user_money` double DEFAULT NULL,
  `user_create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

新增数据:

insert into user(user_id, user_name, user_age, user_password, user_money, user_create_time)  
values('1', '张三', '21', '123456', '12', '2018-08-27 16:31:25'),
('2', '李四', '23', '123456', '34', '2018-08-21 00:00:00'),
('3', '王五', '25', '123456', '56', '2018-08-21 00:00:00'),
('4', '赵无极', '45', '123456', '43', '2018-08-21 00:00:00'),
('5', '甜心', '34', '123456', '22', '2018-08-21 00:00:00');

 2.写存储过程

我设计了两个存储过程:

1.login存储过程源码如下:
传进去用户id和密码返回是否验证成功。

delimiter //
CREATE PROCEDURE `login`(in id int,in pw varchar(20),out result varchar(100))
begin 
declare  a int; 
set a = 0;
select count(*) into a from user where user_id = id and user_password = pw;
case when a > 0 then
set result = "success";
update user set user_create_time = now() where user_id = id;
else
set result = "fail";
end case;
select result;
end; //

2.userMoney存储过程源码如下:

该存储过程没有什么意义的,但是为了使用三个循环的而新建的一个字符串拼接的存储过程,纯属练习,勿喷哦^_^!

delimiter //
CREATE  PROCEDURE `userMoney`(inout num int,inout result varchar(100))
begin
while num < 5 do
set result = concat(result,num,'->');
set num = num + 1;
end while;

repeat
set result = concat(result,num,'=>>');
set num = num + 1;
until num >10
end repeat;

tiaojian: loop
if num > 15 then
leave tiaojian;
else
set num = num + 1;
end if;
set result = concat(result,num,"++>");
iterate tiaojian;
end loop;
select result;
end; //

3.使用储存过程

 写完存储过程就是调用了呀,我们来使用了哦;

call login(1,"123456",@result); 返回的是:

 +---------+
| @result |
+---------+
| success |
+---------+

现在result的值为success,可以select @result获取到result的值;

set @num = 1;

set @result = ' ';

call userMoney(@num, @result);

+-----------------------------------------------------------------+
| result                                                          |
+-----------------------------------------------------------------+
|  1->2->3->4->5=>>6=>>7=>>8=>>9=>>10=>>12++>13++>14++>15++>16++> |
+-----------------------------------------------------------------+

select @num, @result;获取num和result的值

+------+-----------------------------------------------------------------+
| @num | @result                                                         |
+------+-----------------------------------------------------------------+
|   16 |  1->2->3->4->5=>>6=>>7=>>8=>>9=>>10=>>12++>13++>14++>15++>16++> |
+------+-----------------------------------------------------------------+

4.使用心得

  • IN - 是默认模式。在存储过程中定义IN参数时,调用程序必须将参数传递给存储过程。 另外,IN参数的值被保护。这意味着即使在存储过程中更改了IN参数的值,在存储过程结束后仍保留其原始值。换句话说,存储过程只使用IN参数的副本。
  • OUT - 可以在存储过程中更改OUT参数的值,并将其更改后新值传递回调用程序。请注意,存储过程在启动时无法访问OUT参数的初始值。
  • INOUT - INOUT参数是INOUT参数的组合。这意味着调用程序可以传递参数,并且存储过程可以修改INOUT参数并将新值传递回调用程序。
  • 当将单个表达式与唯一值的范围进行比较时,简单CASE语句IF语句更易读。另外,简单CASE语句比IF语句更有效率。
  • 当您根据多个值检查复杂表达式时,IF语句更容易理解。
  • 如果您选择使用CASE语句,则必须确保至少有一个CASE条件匹配。否则,需要定义一个错误处理程序来捕获错误。IF语句则不需要处理错误。
  • 在某些情况下,IFCASE混合使用反而使您的存储过程更加可读和高效。
  • LEAVE语句用于立即退出循环,而无需等待检查条件。LEAVE语句的工作原理就类似PHPC/C++Java等其他语言的break语句一样。
  • ITERATE语句允许您跳过剩下的整个代码并开始新的迭代。ITERATE语句类似于PHPC/C++Java等中的continue语句。
  • repeater和do while有点相似,先执行后判断,loop其实可以说和goto语句相似

<_^-^__^-^__^-^__^-^__^-^__^-^__^-^__菜鸟学习中,有什么不对请多多指教__^-^__^-^__^-^__^-^__^-^__^-^__^-^__^-^_>

猜你喜欢

转载自blog.csdn.net/qq_26584263/article/details/82116667