Что я делаю не так в этой процедуре - PullRequest
0 голосов
/ 13 мая 2018

Я создал процедуру для проверки и проверки имени пользователя и пароля, даже когда я предоставляю правильный пароль, я всегда получаю ошибку исключения. Я пробовал разные вещи внутри процедуры, но результаты были бы такими же.

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;

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

Ваша проблема при открытии 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;
0 голосов
/ 14 мая 2018

Я возьму другой курс на этот. Я вижу одну потенциальную ошибку, которая переопределяет все, что касается синтаксиса и функциональности, а именно:

Я действительно ДЕЙСТВИТЕЛЬНО надеюсь, что вы не планируете хранить пароли в виде открытого текста в таблице базы данных.

Никогда не делай этого .... никогда. Пожалуйста, скажите нам, что эта подпрограмма уже содержит пароль / хешированный пароль, прежде чем перейти к этой подпрограмме и таблице. В противном случае, это первое, на что вы должны обратить внимание, прежде чем что-либо исправлять.

0 голосов
/ 13 мая 2018

Я давно не смотрел на PL \ SQL.Тем не менее, мое первое предложение было бы посмотреть на ваши тестовые данные:

SELECT * FROM bb_shopper where username = 'rat55';

Несколько вещей, которые нужно иметь в виду:

  • Последняя строка в блоке для проверки кода былавероятно, это должно быть закомментировано.Он содержит кавычку, оставленную открытой, и закрывающую скобку без открывающей скобки.Это не может помочь.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...