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

Oracle 与前一个密码具有3个不同字符的密码-PL/SQL,oracle,plsql,passwords,plsqldeveloper,Oracle,Plsql,Passwords,Plsqldeveloper,因此,我的任务包含一个密码,该密码与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(passwo

因此,我的任务包含一个密码,该密码与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);
如果旧密码不为空,则
差异:=长度(旧密码)-长度(密码);
差异:=abs(差异);
如果长度(密码)<长度(旧密码),则
m:=长度(密码);
其他的
m:=长度(旧密码);
如果结束;
对于1..m循环中的i
如果substr(密码,i,1)!=substr(旧密码,i,1)然后
差异:=差异+1;
如果结束;
端环;
如果差值小于3,则
raise_应用程序_错误(-20011,'密码应与\
旧密码至少3个字符“);
如果结束;
如果结束;
--一切都很好;返回TRUE;
返回(真);
如果我的旧密码是“aaa”,而我将其更改为“aaa222”,它会给我一个错误。那很好

但如果我的旧密码是“aaa”,我把它改为“aaa2222”,它不会给我一个错误,我不知道为什么。这应该给我一个错误


怎么了?有什么解决方案吗?

从您发布的代码来看,您的结果没有意义,我认为您发布的代码中有一个输入错误(请参阅下面的评论),但让我们分析一下代码实际在做什么

显而易见

IF old_password IS NOT NULL THEN
differ := length(old_password) - length(password);
differ := abs(differ);
在第一种情况下,这两行将差值设置为3,第二种情况下将差值设置为4,因为字符串长度不同

IF old_password IS NOT NULL THEN
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;

在第一种情况下,差值为3,在第二种情况下,差值为4,因此除非您对
aa1a
aaa2
有什么不同?它应该返回什么?为什么?当我以“aaa”作为旧密码,以“aaa222”作为新密码运行您的代码时,它将成功完成(即无错误)???它应该返回一个错误,因为它必须与以前的密码有3个不同的字符。在这种情况下,只有“2”不同。但是这段代码有点错误,因为它成功地完成了。您首先要检查长度是否不同。将
'aaa'
作为旧密码,将
'aaa222'
作为新密码。长度的差异是3,因此您永远不会进入以
开头的块,如果差异<3,则进入
。也许您想做的是在每个密码中创建一个唯一字符的集合,然后比较它们。我消除了“IF difference<3 then”,但我有同样的问题。
-- Everything is fine; return TRUE ;   
RETURN(TRUE);