Ошибка в моей процедуре

#oracle #plsql

#Oracle #plsql

Вопрос:

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

Комментарии:

1. поместите свой код в виде текста, а не изображения

2. выполните базовую отладку. добавляйте по одной строке за раз, чтобы определить, какая строка вызывает у вас проблему. Но я говорю вам, если вы ожидаете, что один пользователь с более чем одной учетной записью SELECT INTO потерпит неудачу

3. users. password с пробелом между . и password выглядит сомнительно для меня. То же самое users. user_id %type . Чтобы узнать больше об ошибках, вы можете попробовать SELECT * FROM ALL_ERRORS WHERE NAME='LOGIN_USE' . Желаю удачи.

4. Если вы компилируете процедуру в SQL * Plus, то либо введите show errors сразу после компиляции (когда увидите сообщение «создано с ошибками компиляции»), либо еще show errors procedure login_use . Если вы используете такой инструмент, как SQL Developer или PL / SQL Developer, узнайте, как заставить его автоматически отображать ошибки компиляции. Вам не нужно их угадывать.

Ответ №1:

«set serveroutput on» не работает с хранимой процедурой.

Никогда не используйте «select into», если вы точно не знаете, что результатом является 1 запись. В вашем примере результатом также может быть 2 (или более) записи.

Сначала создайте курсор для подсчета записей. Если результат подсчета равен 0 (нулю), отобразите сообщение. Если результат подсчета равен 1, используйте «выбрать в». Лучше использовать конструкцию open, fetch, close. И если результат подсчета больше 1, тогда покажите сообщение о том, что существует более 1 (!!!) acoounts.

Это вопрос, связанный с работой или школой?

Ответ №2:

С небольшим количеством распознавания текста и ручной настройки я делаю вашу процедуру такой:

 create or replace procedure LOGIN_USE(USER_EMAIL IN VARCHAR, USER_PASSWORD IN
VARCHAR) IS

acttype users.account_type%type;
psword users. password%type;
acctuser users. user_id %type;
message varchar(100) := 'User name or password are incorrect';

Begin
SELECT account_type, password, user_id INTO acttype, psword, acctuser
FROM users
WHERE email = USER_EMAIL;

IF(psword = USER_PASSWORD) THEN
dbms_output.put_line('Hello, and Welcome ' || USER_EMAIL);
dbms_output.put_line('Account Type ' || acttype);
ELSIF (acctuser >= 2) THEN
dbms_output.put_line('Warning, You have more than two accounts');
ELSE
dbms_output.put_line(message);
END IF;
END;
  

Когда приведено в порядок для удобства чтения (вы должны привыкнуть делать это самостоятельно), я получаю это:

 create or replace procedure login_use
    ( user_email    in varchar
    , user_password in varchar )
as
    acttype  users.account_type%type;
    psword   users.password%type;
    acctuser users.user_id%type;
    message  varchar(100) := 'User name or password are incorrect';

begin
    select account_type, password, user_id
    into   acttype,      psword,   acctuser
    from   users
    where  email = user_email;

    if psword = user_password then
        dbms_output.put_line('Hello, and Welcome ' || user_email);
        dbms_output.put_line('Account Type ' || acttype);
    elsif acctuser >= 2 then
        dbms_output.put_line('Warning, You have more than two accounts');
    else
        dbms_output.put_line(message);
    end if;
end;
  

Это отлично скомпилировалось для меня после того, как я создал USERS таблицу как

 create table users
( account_type  varchar2(10)
, password      varchar2(20)
, user_id       integer
, email         varchar2(50) );
  

Однако:

  1. Вы должны использовать varchar2 не varchar .
  2. Я не вижу смысла выбирать users.user_id в acctuser (кстати, запутанная система именования), затем проверять, превышает ли этот идентификатор пользователя 1, и, если да, предупреждать, что у пользователя более двух учетных записей. Для каких типичных значений user_id в вашей users таблице? Какое отношение имеет идентификатор выше 1 к количеству учетных записей? Вы имели в виду подсчет строк? Если users.email не является уникальным, то вам нужно немного переосмыслить подход.
  3. Я очень надеюсь, что это не для какой-либо реальной системы, поскольку она хранит пароли в виде обычного текста. Было бы что-то, по крайней мере, если бы вы хэшировали их вместе с адресом электронной почты.