【问题标题】:What I am doing wrong in this procedure我在这个过程中做错了什么
【发布时间】:2018-10-23 07:15:10
【问题描述】:

我已经创建了检查和验证用户名和密码的程序,即使我提供了正确的密码,我总是会收到异常错误。我在程序中尝试了不同的东西,但结果是一样的。

create or replace 
PROCEDURE member_ck_sp
  (p_uname IN VARCHAR2,
   p_pass IN VARCHAR2,
   p_name OUT VARCHAR2,
   p_cookie OUT VARCHAR2)
IS
   CURSOR CUR_CHECK IS
   SELECT USERNAME, PASSWORD,FIRSTNAME||''||LASTNAME, COOKIE
   FROM bb_shopper;
   lv_check_txt VARCHAR2(100);
BEGIN
   FOR rec_check IN cur_check LOOP
   IF p_uname = rec_check.username 
      AND p_pass = rec_check.PASSWORD THEN
   lv_check_txt := 'Pass';
   ELSE lv_check_txt := 'Fail';
   END IF;
   END LOOP;

 IF lv_check_txt = 'Pass' THEN
    SELECT FIRSTNAME||''||LASTNAME, COOKIE
    INTO   p_name, p_cookie
    FROM   bb_shopper
    WHERE USERNAME = P_UNAME
    AND   password = p_pass;
    dbms_output.put_line(p_name||' '|| p_cookie);
 ELSE raise no_data_found;
 END IF;
--dbms_output.put_line(p_name||' '|| p_cookie);
EXCEPTION
  WHEN no_data_found THEN
  dbms_output.put_line('Please reneter credentials');
END;

并阻止检查代码:

DECLARE
    lv_username_txt bb_shopper.username%TYPE := 'rat55';
    lv_password_txt bb_shopper.PASSWORD%TYPE := 'kile';
    lv_name_txt VARCHAR2(200);
    lv_cookie_txt bb_shopper.cookie%TYPE;
BEGIN
    member_ck_sp(lv_username_txt,lv_password_txt,lv_name_txt,lv_cookie_txt);
    --DBMS_OUTPUT.PUT_LINE('User name is '||lv_name_txt||' and      
    cookie '||lv_cookie_txt);
END;

【问题讨论】:

  • 请提供有关您的异常的更多信息。

标签: oracle plsql


【解决方案1】:

好久没看PL\SQL了。但是,我的第一个建议是查看您的测试数据:

SELECT * FROM bb_shopper where username = 'rat55';

需要注意的几点:

  • 检查代码块中的最后一行可能是要被注释掉的。它包含一个左开引号和一个不带左括号的右括号。这无济于事。

【讨论】:

  • 因为 UI 中的注释是一行,所以它被注释掉了,但是当我粘贴该块时,它显示为 2 行。
  • 第二次我已经检查了用户名 = 'rat55' 的数据并且有第一个和姓氏,当我按原样运行代码时,无论我是否提供正确的凭据,它只会打印出异常错误消息。
  • 您确定 %TYPE 需要存在吗?见stackoverflow.com/questions/10886568/…
  • 你的第二个说法没有任何意义。
【解决方案2】:

您的问题是打开的 LOOP 读取了bb_shopper 中的所有记录。这些记录之一可能与输入的凭据匹配。但是,除非读取的最后一条记录是匹配的,否则您将使用lv_check_txt = 'Fail' 退出循环。这就是为什么你总是在随后的 IF 中没有通过测试并得到no_data_found

解决方案似乎很简单:放弃循环,只验证传递的参数。

create or replace 
PROCEDURE member_ck_sp
  (p_uname IN VARCHAR2,
   p_pass IN VARCHAR2,
   p_name OUT VARCHAR2,
   p_cookie OUT VARCHAR2)
IS
BEGIN
    SELECT FIRSTNAME||''||LASTNAME, COOKIE
    INTO   p_name, p_cookie
    FROM   bb_shopper
    WHERE USERNAME = P_UNAME
    AND   password = p_pass;

    --dbms_output.put_line(p_name||' '|| p_cookie);
EXCEPTION
  WHEN no_data_found THEN
     raise_application_error(-20000, 'Please re-enter credentials');
END;

【讨论】:

    【解决方案3】:

    我将对此采取不同的策略。我看到一个 潜在 错误,它覆盖了有关语法和功能的任何内容,那就是:

    我真的非常非常希望您不打算将明文密码存储在数据库表中。

    永远不要这样做......永远。请告诉我们,此例程在进入此例程和表之前已经对密码进行了盐渍/散列处理。否则,这是您应该首先考虑修复的问题。

    【讨论】:

    • 这只是准备参加Oracle考试的练习项目之一。谢谢你的建议。
    猜你喜欢
    • 2022-01-16
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多