使用 IN 和 OUT 参数更改密码过程 PLSQL

Posted

技术标签:

【中文标题】使用 IN 和 OUT 参数更改密码过程 PLSQL【英文标题】:Change password procedure PLSQL using IN and OUT parameters 【发布时间】:2018-05-23 18:19:33 【问题描述】:

晚上好!

我正在尝试在 PLSQL 中创建一个可以更改用户密码的存储过程。我想检查当前密码是否正确,然后我将更新用户密码或打印错误。到目前为止,我想出的是以下代码。我正在努力使用不同的参数以及如何使用它们来检查密码是否正确。有人可以给我小费吗?任何建议表示赞赏!

CREATE OR REPLACE PROCEDURE CHANGE_PWD (
    P_USERNAME   IN     USERS.USERNAME%TYPE,
    P_OLD_PW     IN     USERS.PASSWORD%TYPE,
    P_NEW_PW     IN     USERS.PASSWORD%TYPE,
    P_SUCCES        OUT BOOLEAN)
IS
BEGIN
    SELECT USERS.PASSWORD
      INTO P_OLD_PW
      FROM USERS
     WHERE USERS.USERNAME = p_username;

    IF p_old_pw = USERS.PASSWORD
    THEN
        UPDATE USERS
           SET PASSWORD = p_new_pw
         WHERE USERS.USERNAME = p_username;
    ELSE
        RETURN < error message > ;
    END IF;
END CHANGE_PWD;

【问题讨论】:

哎哟......密码永远不应该被存储。 【参考方案1】:

这是一个选项。

首先,一张测试表:

SQL> create table users
  2    (username varchar2(30),
  3     password varchar2(20));

Table created.

SQL> insert into users values ('LITTLEFOOT', '2cellos');

1 row created.

程序;我建议您返回一个字符串,而不是布尔值(使用它更容易):

SQL> create or replace procedure change_pwd
  2    (p_username   in users.username%type,
  3     p_old_pw     in users.password%type,
  4     p_new_pw     in users.password%type,
  5     p_success   out varchar2
  6    )
  7  is
  8    l_old_pw  users.password%type;
  9  begin
 10    select password
 11      into l_old_pw
 12      from users
 13      where username = p_username;
 14
 15    if l_old_pw = p_old_pw then
 16       -- OK, old password matches
 17       update users set
 18         password = p_new_pw
 19         where username = p_username;
 20       p_success := 'Password changed';
 21    else
 22       p_success := 'Invalid old password';
 23    end if;
 24  exception
 25    when no_data_found then
 26      p_success := 'Invalid username';
 27  end;
 28  /

Procedure created.

测试:

SQL> set serveroutput on;
SQL> declare
  2    l_succ varchar2(100);
  3  begin
  4    change_pwd('LITTLEFOOT', 'xyz', 'newpwd', l_succ);
  5    dbms_output.put_line(l_succ);
  6
  7    change_pwd('bigFOOT', 'abc', 'newpwd', l_succ);
  8    dbms_output.put_line(l_succ);
  9
 10    change_pwd('LITTLEFOOT', '2cellos', 'newpwd', l_succ);
 11    dbms_output.put_line(l_succ);
 12  end;
 13  /
Invalid old password
Invalid username
Password changed

PL/SQL procedure successfully completed.

SQL>

【讨论】:

【参考方案2】:

你有一些错误

CREATE OR REPLACE PROCEDURE CHANGE_PWD (P_USERNAME IN USERS.USERNAME %TYPE,                                         
                                    P_OLD_PW   USERS.PASSWORD%TYPE,                                     
                                    P_NEW_PW IN USERS.PASSWORD %TYPE, 
                                    P_SUCCES OUT BOOLEAN ) IS
 VC_OLD_PW   USERS.PASSWORD%TYPE;

 BEGIN

    SELECT U.PASSWORD 
      INTO VC_OLD_PW 
      FROM USERS U
     WHERE U.USERNAME = p_username;

   /*Validate old pass*/
   IF VC_OLD_PW = USERS.PASSWORD THEN
      UPDATE USERS
         SET PASSWORD = p_new_pw
       WHERE USERS.USERNAME = p_username;
       COMMIT;
      --Ok change
      P_SUCCES   := TRUE;
   ELSE 
      --Change fail
      P_SUCCES  := FALSE;
      --RETURN <error message>; //This is unnecesary    
   END IF;

EXCEPTION
//Any exception
WHEN OTHERS THEN    
    P_SUCCES  := FALSE;   
    DBMS_OUTPUT.PUT_LINE('Error in procedure CHANGE_PWD '||SQLERRM)
END CHANGE_PWD;

您需要对此进行更多研究,但这很正常。

问候。

【讨论】:

感谢您的澄清。我特别忘记了变量,这真的很有帮助!

以上是关于使用 IN 和 OUT 参数更改密码过程 PLSQL的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义 ItemReader 调用带有 IN 和 OUT 参数的存储过程

使用两个过程用 OUT 和 IN 参数进行简单计算,PL/SQL Oracle

Java 和 PostgreSQL 存储过程 - 返回注册为 out 参数,导致 in 参数出现问题

oracle中in和out用法

创建存储过程 in,out,inout

MySQL---存储过程复习