密码与上一个密码有3个不同的字符-PL / SQL

问题描述 投票:0回答:1

因此,我的任务包含一个密码,该密码与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”,则不会出现错误,我不知道为什么。这应该给我一个错误。.

怎么了?有解决方案吗?

oracle plsql passwords plsqldeveloper
1个回答
0
投票

从您发布结果的代码中没有意义,我认为您发布的代码中有错别字(请参阅下面的评论),但让我们分析代码的实际作用。

明显

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);
© www.soinside.com 2019 - 2024. All rights reserved.