#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) );
Однако:
- Вы должны использовать
varchar2
неvarchar
. - Я не вижу смысла выбирать
users.user_id
вacctuser
(кстати, запутанная система именования), затем проверять, превышает ли этот идентификатор пользователя 1, и, если да, предупреждать, что у пользователя более двух учетных записей. Для каких типичных значенийuser_id
в вашейusers
таблице? Какое отношение имеет идентификатор выше 1 к количеству учетных записей? Вы имели в виду подсчет строк? Еслиusers.email
не является уникальным, то вам нужно немного переосмыслить подход. - Я очень надеюсь, что это не для какой-либо реальной системы, поскольку она хранит пароли в виде обычного текста. Было бы что-то, по крайней мере, если бы вы хэшировали их вместе с адресом электронной почты.