当用户可以介绍他们的用户名和密码时,我被要求创建一个程序,我应该能够根据“购物者”表中的内容匹配用户信息。我创建了一个对我来说似乎正确的过程,但是当我运行插入有效用户名和有效密码的过程时,它告诉我:it cannot be used as an assignment target
在这里,我将发布我的代码,看看我是否能得到任何帮助。 作为问题的一部分,我应该使用IN OUT参数,该过程从用户接收用户名和密码,并在登录匹配时返回全名。如果用户没有输入正确的信息,则假定保持“INVALID”的变量显示该消息。 有没有人会知道这里的错误是什么,我花了很多时间试图解决这个问题,但我仍然不能。 我感谢任何帮助。
create or replace PROCEDURE member_ck_sp
(p_user IN VARCHAR2,
p_pass IN OUT VARCHAR2)
IS
lv_check_txt VARCHAR2(10) := 'INVALID';
lv_fullname_txt VARCHAR2(25);
CURSOR MEMBER_CUR IS
SELECT firstname, lastname, cookie, username, password
FROM bb_shopper
WHERE username = p_user
AND password = p_pass;
BEGIN
FOR REC_CUR IN MEMBER_CUR LOOP
IF p_user = rec_cur.username AND p_pass = rec_cur.password THEN
p_pass := rec_cur.firstname || ' ' || rec_cur.lastname;
dbms_output.put_line('Welcome: ' || p_pass || 'Cookie: ' || rec_cur.cookie);
ELSE
dbms_output.put_line(lv_check_txt);
END IF;
END LOOP;
END member_ck_sp;
答案 0 :(得分:1)
您的程序编译并在某种程度上有效:您正在修改p_pass
,但由于它是IN OUT
参数,因此应该可以使用。
但是,您无法使用常量调用此函数:
SQL> begin member_ck_sp('ab', 'xx'); end;
2 /
ORA-06550: line 2, column 26:
PLS-00363: expression 'xx' cannot be used as an assignment target
ORA-06550: line 2, column 7:
PL/SQL: Statement ignored
因为常量不能用作OUT
参数。您可以使用变量调用该过程:
SQL> DECLARE
2 l_user VARCHAR2(100) := 'ab';
3 l_password VARCHAR2(100) := 'xx';
4 BEGIN
5 member_ck_sp(l_user, l_password);
6 END;
7 /
Welcome: a bCookie:
PL/SQL procedure successfully completed
但是,使用非密码的其他值更新密码参数没有多大意义。我建议你修改程序,以便不更新密码,改为使用局部变量:
SQL> CREATE OR REPLACE PROCEDURE member_ck_sp(p_user IN VARCHAR2,
2 p_pass IN VARCHAR2) IS
3 lv_check_txt VARCHAR2(10) := 'INVALID';
4 lv_fullname_txt VARCHAR2(25);
5 CURSOR MEMBER_CUR IS
6 SELECT firstname, lastname, cookie, username, password
7 FROM bb_shopper
8 WHERE username = p_user
9 AND password = p_pass;
10 BEGIN
11 FOR REC_CUR IN MEMBER_CUR LOOP
12 IF p_user = rec_cur.username AND p_pass = rec_cur.password THEN
13 lv_fullname_txt := rec_cur.firstname || ' ' || rec_cur.lastname;
14 dbms_output.put_line('Welcome: ' || lv_fullname_txt
15 || 'Cookie: ' || rec_cur.cookie);
16 ELSE
17 dbms_output.put_line(lv_check_txt);
18 END IF;
19 END LOOP;
20 END member_ck_sp;
21 /
Procedure created
SQL> begin member_ck_sp('ab', 'xx'); end;
2 /
Welcome: a bCookie:
PL/SQL procedure successfully completed
另外不要忘记对密码进行哈希处理,看起来您的模型以明文形式存储密码(don't do that)。
答案 1 :(得分:1)
试试这个
create or replace PROCEDURE member_ck_sp
(p_user IN VARCHAR2,
p_pass IN VARCHAR2,
p_FullName OUT VARCHAR2)
IS
failour_msg varchar2(50) := 'INVALID USER NAME';
CURSOR MEMBER_CUR IS
SELECT firstname, lastname, cookie, username, password
FROM bb_shopper
WHERE upper(username) = upper(p_user)
AND password = p_pass;
BEGIN
p_FullName := failour_msg;
FOR REC_CUR IN MEMBER_CUR LOOP
p_FullName := rec_cur.firstname || ' ' || rec_cur.lastname;
dbms_output.put_line('Welcome: ' || p_pass || 'Cookie: ' || rec_cur.cookie);
END LOOP;
if p_FullName = failour_msg then
dbms_output.put_line(failour_msg);
end if;
END member_ck_sp;