У вас есть ряд синтаксических ошибок.
- У вас есть посторонний
varchar(20))
в первом if
выражении.
- Вы пропускаете
THEN
в ELSEIF
заявлениях.
- Вы написали
update.borrower
вместо update borrower
.
- У вас есть
roll_no
в кавычках в некоторых из ваших update
утверждений.
- Параметр
roll_no
такой же, как столбец таблицы, поскольку в именах столбцов регистр не учитывается. Из-за этого условие where Roll_no = roll_no
будет соответствовать каждой строке. Дайте параметру другое имя.
- В
SELECT
предложение INTO
идет после FROM
, а не в конце.
- Нет необходимости использовать курсор, если вы используете
SELECT INTO
. Просто выполните запрос, и он установит переменную.
Вы также можете упростить код, поместив разницу в дату в переменную, чтобы вам не приходилось многократно ее вычислять. А в ELSEIF
вам не нужно тестировать >= 15
, так как вы получите его только в случае неудачного теста < 15
.
Оператор UPDATE
одинаков во всех условиях, поэтому он вообще не должен быть в IF
.
delimiter //
create procedure student( in p_roll_no int,in Nameofbook varchar(40))
begin
declare Dateofiss1 date;
declare diff INT;
select Dateofiss from Borrower into Dateofiss1 where Roll_no = p_roll_no;
OPEN cur;
SET diff = datediff(sysdate(),Dateofiss1)
IF diff BETWEEN 15 AND 29 THEN
SET FINEAMOUNT= 5 * (diff - 15)
insert into Fine(Roll_no,Date,amount)values(rollno,sysdate,fineamount);
else
SET FINEAMOUNT= 50 * (diff - 15)
insert into Fine(Roll_no,Date,amount)values(rollno,sysdate,fineamount);
end if
update Borrower set status='R'where Roll_no=p_roll_no
select * from Borrower;
select * from Fine;
end