ошибка в хранимой процедуре ... в ключевое слово - PullRequest
0 голосов
/ 04 сентября 2018

Две таблицы Заемщик (rollno, имя, bookissue_date) и Fine (rollno, имя, сумма)

delimiter //
create procedure student( in roll_no int,in Nameofbook varchar(40))

begin 
    declare Dateofiss1 date;
    Declare cur cursor for 

    select Dateofiss from Borrower where Roll_no = roll into Dateofiss1;

    OPEN cur;
    fetch cur into Dateofiss1
    if(datediff(sysdate(),Dateofiss1)<15) then varchar(20))
        update Borrower set status='R'where Roll_no=roll_no

    elseif(datediff(sysdate(),Dateofiss1)>=15)and datediff (sysdate(),Dateofiss1<30)
        SET FINEAMOUNT=5*(datediff(sysdate(),Dateofiss1)-15)
        insert into Fine(Roll_no,Date,amount)values(rollno,sysdate,fineamount);
        update.borrower set status='R' where Roll_no='rollno';
    elseif (datediff(sysdate(),Dateofiss1)>30)
        SET FINEAMOUNT=50*(datediff(sysdate(),Dateofiss1)-15)
        insert into Fine(Roll_no,Date,amount)values(rollno,sysdate,fineamount);
        update.borrower set status='R' where Roll_no='rollno';

        close cur;
    end if
    select * from Borrower;
    elect * from Fine;
end 

1 Ответ

0 голосов
/ 04 сентября 2018

У вас есть ряд синтаксических ошибок.

  1. У вас есть посторонний varchar(20)) в первом if выражении.
  2. Вы пропускаете THEN в ELSEIF заявлениях.
  3. Вы написали update.borrower вместо update borrower.
  4. У вас есть roll_no в кавычках в некоторых из ваших update утверждений.
  5. Параметр roll_no такой же, как столбец таблицы, поскольку в именах столбцов регистр не учитывается. Из-за этого условие where Roll_no = roll_no будет соответствовать каждой строке. Дайте параметру другое имя.
  6. В SELECT предложение INTO идет после FROM, а не в конце.
  7. Нет необходимости использовать курсор, если вы используете 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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...