通过一些 OCR 和手动操作,我将您的程序设置为:
create or replace procedure LOGIN_USE(USER_EMAIL IN VARCHAR, USER_PASSWORD IN
VARCHAR) IS
acttype users.account_type%type;
psword users. password%type;
acctuser users. user_id %type;
message varchar(100) := 'User name or password are incorrect';
Begin
SELECT account_type, password, user_id INTO acttype, psword, acctuser
FROM users
WHERE email = USER_EMAIL;
IF(psword = USER_PASSWORD) THEN
dbms_output.put_line('Hello, and Welcome ' || USER_EMAIL);
dbms_output.put_line('Account Type ' || acttype);
ELSIF (acctuser >= 2) THEN
dbms_output.put_line('Warning, You have more than two accounts');
ELSE
dbms_output.put_line(message);
END IF;
END;
当整理好可读性(你应该养成自己这样做的习惯)时,我明白了:
create or replace procedure login_use
( user_email in varchar
, user_password in varchar )
as
acttype users.account_type%type;
psword users.password%type;
acctuser users.user_id%type;
message varchar(100) := 'User name or password are incorrect';
begin
select account_type, password, user_id
into acttype, psword, acctuser
from users
where email = user_email;
if psword = user_password then
dbms_output.put_line('Hello, and Welcome ' || user_email);
dbms_output.put_line('Account Type ' || acttype);
elsif acctuser >= 2 then
dbms_output.put_line('Warning, You have more than two accounts');
else
dbms_output.put_line(message);
end if;
end;
在我创建 USERS 表后,这对我来说很好
create table users
( account_type varchar2(10)
, password varchar2(20)
, user_id integer
, email varchar2(50) );
但是:
- 您应该使用
varchar2 而不是varchar。
- 我看不出将
users.user_id 选择为acctuser(令人困惑的命名系统顺便说一句)然后检查该用户ID 是否大于1 以及如果是则警告用户拥有两个以上帐户的意义。 users 表中 user_id 的典型值是什么? ID大于1与账户数量有什么关系?你的意思是计算行数吗?如果users.email 不是唯一的,那么您需要重新考虑一下这种方法。
- 我非常希望这不适用于任何实际系统,因为它以纯文本形式存储密码。如果您将它们与电子邮件地址一起散列,至少会是一些东西。