2013-05-06 112 views
1

我已經被要求創建一個程序,當用戶可以引入他們的用戶名和密碼時,我應該能夠根據「購物者」中的內容匹配用戶信息,表。我創建了一個對我來說似乎正確的過程,但是當我運行插入有效用戶名和有效密碼的過程時,它告訴我:it cannot be used as an assignment target在PL/SQL中創建登錄過程

在這裏,我將發佈我的代碼以查看是否可以獲得任何幫助。 作爲問題的一部分,我應該使用一個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

你的程序編譯,有點工作原理是:你正在修改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)。

+0

感謝您的重播。但即使我已經嘗試了你剛剛提到的,沒有任何反應,我仍然得到相同的錯誤,任何其他的消化? – user2112768 2013-05-06 12:54:37

+0

更新密碼參數沒有多大意義。查看我更新的答案或[@ M.Heydari](http://stackoverflow.com/users/2039695/m-heydari)的答案以更改您的程序聲明。 – 2013-05-06 15:17:04

+0

謝謝你的工作! – user2112768 2013-05-08 15:44:18

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;