Процедура смены пароля PLSQL с использованием параметров IN и OUT - PullRequest
0 голосов
/ 23 мая 2018

Добрый вечер!

Я пытаюсь создать хранимую процедуру в 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;

Ответы [ 2 ]

0 голосов
/ 24 мая 2018

у вас есть некоторые ошибки

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;

Вам нужно изучить немного больше об этом, но это нормально.

С уважением.

0 голосов
/ 24 мая 2018

Вот один из вариантов.

Сначала тестовая таблица:

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>
...