因此,我的任务包含一个密码,该密码与PL / SQL中的上一个密码具有3个不同的字符。这是代码:
IF old_password IS NOT NULL THEN
differ := length(old_password) - length(password);
differ := abs(differ);
IF length(password) < length(old_password) THEN
m := length(password);
ELSE
m := length(old_password);
END IF;
FOR i IN 1..m LOOP
IF substr(password,i,1) != substr(old_password,i,1) THEN
differ := differ + 1;
END IF;
END LOOP;
IF differ < 3 THEN
raise_application_error(-20011, 'Password should differ from the \
old password by at least 3 characters');
END IF;
END IF;
-- Everything is fine; return TRUE ;
RETURN(TRUE);
如果我的旧密码是“ aaa”,而我将其更改为“ aaa222”,则会给我一个错误。很好。
但是如果我的旧密码是“ aaa”,而我将其更改为“ aaa2222”,则不会出现错误,我不知道为什么。这应该给我一个错误。.
怎么了?有解决方案吗?
从您发布结果的代码中没有意义,我认为您发布的代码中有错别字(请参阅下面的评论),但让我们分析代码的实际作用。
明显
IF old_password IS NOT NULL THEN
由于字符串长度不同,这两种情况在您的第一种情况下将差异设置为3,在第二种情况下将差异设置为4
differ := length(old_password) - length(password);
differ := abs(differ);
无论哪种情况,此块都选择两个密码中的较短者,因此在两种情况下都将返回3(aaa的初始密码)
IF length(password) < length(old_password) THEN
m := length(password);
ELSE
m := length(old_password);
END IF;
您循环输入短密码的长度,并在前三个字符均为aaa的情况下将其与长密码进行逐字符比较,因此匹配,因此您不会进入if语句
FOR i IN 1..m LOOP
IF substr(password,i,1) != substr(old_password,i,1) THEN
differ := differ + 1;
END IF;
END LOOP;
在您的第一种情况下,差异为3,在第二种情况下,差异为4,因此除非您具有<=而不是
IF differ < 3 THEN
raise_application_error(-20011, 'Password should differ from the \
old password by at least 3 characters');
END IF;
END IF;
在两种情况下均返回true。
-- Everything is fine; return TRUE ;
RETURN(TRUE);