在PL / SQL中创建登录过程

时间:2013-05-06 11:25:31

标签: sql database plsql

当用户可以介绍他们的用户名和密码时,我被要求创建一个程序,我应该能够根据“购物者”表中的内容匹配用户信息。我创建了一个对我来说似乎正确的过程,但是当我运行插入有效用户名和有效密码的过程时,它告诉我: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;

2 个答案:

答案 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;