使用 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