TA的每日心情 | 开心 2021-12-13 21:45 |
---|
签到天数: 15 天 [LV.4]偶尔看看III
|
假如创建了一个表t_customer,其中字段username为用户名,password为密码,lock_date用户被锁定时间,enable为是否锁定,0未知,1可用, 2不可用,不可空。try_time尝试登陆次数。
需求如下: 如果一个用户尝试登陆系统5次失败,那么用户将会被锁定24小时。
创建存储过程如下:
create or replace procedure UPDATE_CUSTOMER_LOGIN
(
username in t_customer.username%type, ---用户名
password in t_customer.password%type, ---孕妇密码.
nowDate in date, ---当前时间
loginFlag out varchar2, --登录标志,1.登录成功,2.用户名不存在,3.用户锁定中,4.用户名正确,密码错误,5.账号已锁定,请24小时后再试
resultFlag out varchar2, ---1:返回为空,0:返回一条记录,1:返回多条记录
errorFlag out varchar2, ---0:结果正常,1:发生异常
returningResultSet out P_COMMON_PACKAGE.commonInfo ---样本信息结果集
)
is
v_username t_customer.username%type:=username;
v_password t_customer.password%type:=password;
v_nowDate date:=nowDate;
v_sql varchar2(32000);
v_count integer;
v_enable varchar2(100);
v_lock_date Date;
v_try_time number;
v_repasswrod t_customer.password%type;
begin
---用户id不为空
if v_username is not null
then
---查询出样品的相关信息
v_sql:=' select count(*) from t_customer where username='''||v_username||'''';
execute immediate v_sql into v_count;
if v_count>0 then
select t.lock_date,t.try_time,t.enable ,t.password into v_lock_date, v_try_time,v_enable,v_repasswrod
from t_customer t where t.username=v_username;
---如果锁定状态为1:可用
if v_enable=1 then
--如果数据库中的密码与传入的密码一致,则登陆成功
if v_repasswrod=v_password then
loginFlag:=1;
resultFlag:=0; ---1:登录成功
errorFlag:=0;
--设置lock_date为'',try_time为0
update t_customer t set t.lock_date='',t.try_time=0 where t.username=v_username;
open returningResultSet for select * from t_customer t where t.username=v_username;
--如果数据库中的密码与传入的密码不一致
elsif v_repasswrod<>v_password then
--当密码不正确时,判断登陆次数是否小于3。[总共次数为5,默认值为0]
if v_try_time<=3 then
loginFlag:=2;
resultFlag:=-1; ---2:密码错误
errorFlag:=0;
--登陆尝试次数加1
update t_customer t set t.try_time=t.try_time+1 where t.username=v_username;
--当密码不正确时,判断登陆次数是否大于等于4。
elsif v_try_time>=4 then
--设置登陆尝试次数加1,锁定状态为2:不可用。
update t_customer t set t.try_time=t.try_time+1,t.enable=2 ,t.lock_date=v_nowDate where t.username=v_username;
loginFlag:=4;
resultFlag:=-1; ---4:用户锁定中
errorFlag:=0;
end if;
end if;
else
--如果锁定状态不为1,也就说用户可能已经锁定。
--如果lock_date不为空,并且用户已经锁定了24小时,则继续验证用户密码。
if v_lock_date is not null and v_nowDate is not null and to_number(v_nowDate-v_lock_date)*24>=24 then
--密码正确。
if v_repasswrod=v_password then
loginFlag:=1;
resultFlag:=0; ----登录成功
errorFlag:=0;
update t_customer t set t.try_time=0,t.enable=1,t.lock_date='' where t.username=v_username;
open returningResultSet for select * from t_customer t where t.username=v_username;
--密码不正确
elsif v_repasswrod<>v_password then
loginFlag:=2;
resultFlag:=-1; ----2:密码错误
errorFlag:=0;
update t_customer t set t.try_time=1,t.enable=1,t.lock_date='' where t.username=v_username;
open returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
end if;
else
loginFlag:=3;
resultFlag:=-1; ----3:账号已锁定,请24小时后再试
errorFlag:=0;
open returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
end if;
end if;
end if;
elsif v_username is null
then
loginFlag:=2;
resultFlag:=-1; ----2:密码错误
errorFlag:=0;
open returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
end if;
---处理异常
exception
when NO_DATA_FOUND
then
loginFlag:=-1;
resultFlag:=-1;
errorFlag:=1;
open returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
when others
then
loginFlag:=-1;
resultFlag:=-1;
errorFlag:=1;
open returningResultSet for P_COMMON_PACKAGE.GLOBAL_EMPTY_CURSOR;
end;
|
|