IF语句有什么问题?



我试图在PLSQL中使用多个if条件,它给了我一个错误:

ORA-06550: line 16, column 5:
PLS-00103: Encountered the symbol "LOOP" when expecting one of the following:
   if

这是我的代码:

    declare
price_var number;
st_numb number;
co_pr number;
cursor student_count is select STUDENT_NUMBER,COURSE_PRICE from COURSES;
begin
open student_count;
loop
fetch student_count into st_numb,co_pr;
if st_numb<10 then
update COURSES set COURSE_PRICE=co_pr*1.05;
elseif st_numb>10 then
update COURSES set COURSE_PRICE=co_pr*1.07;
end if;
exit when student_count%notfound;
end loop;
end

你能告诉我错误在哪里吗?谢谢。

首先,我认为在PL/SQL中应该是"elsif"而不是"elseif"。然后(我不知道这是否重要),也许你需要在条件周围加上括号,我不知道。

来源:https://www.tutorialspoint.com/plsql/plsql_if_then_elsif.htm

您将需要elsif,而不是elseifend之后的;。试试这个更正:

declare
  price_var number;
  st_numb   number;
  co_pr     number;
  cursor student_count is
    select student_number
          ,course_price
      from courses;
begin
  open student_count;
  loop
    fetch student_count
      into st_numb
          ,co_pr;
    if st_numb < 10 then
      update courses set course_price = co_pr * 1.05;
    elsif st_numb > 10 then   --elsif, not elseif
      update courses set course_price = co_pr * 1.07;
    end if;
    exit when student_count%notfound;
  end loop;
end;  --also need ";" after end 

只是为了补充massko的答案-

普通的游标FOR循环比显式的open-fetch-exit-close更简单、更高效、更可靠。此外,您必须指定要在循环中更新哪一行,否则将更新表中的每一行。(尽管编译器并不关心您如何编写代码,或者是否将随机单词大写,但养成整洁编码的习惯是有益的。)因此,作为第一个重构,我们得到:

begin
    for r in (
        select course_id  -- Assuming courses have a unique ID
             , student_number, course_price
        from   courses
    )
    loop
        if r.student_number < 10 then
            update courses set course_price = r.course_price * 1.05
            where  course_id = r.course_id;
        elsif r.student_number > 10 then
            update courses set course_price = r.course_price * 1.07
            where  course_id = r.course_id;
        end if;
    end loop;
end;

但是,为什么要重复update语句两次,当所有的变化是乘法因子,为什么我们循环通过行,我们不做任何事情?因此,我们可以进一步简化它:

begin
    for r in (
        select course_id, student_number, course_price
        from   courses
        where  student_number <> 10
    )
    loop
        update courses
        set    course_price = r.course_price *
               case
                   when r.student_number < 10 then 1.05
                   when r.student_number > 10 then 1.07
               end
        where  course_id = r.course_id;
    end loop;
end;

那么,当我们可以一次完成时,为什么我们甚至需要一个费力的逐行方法呢?

begin
    update courses c
    set    course_price = r.course_price *
           case
               when c.student_number < 10 then 1.05
               when c.student_number > 10 then 1.07
           end
    where  c.student_number <> 10;
end;

顺便说一句,我不知道你的数据模型,但是在每个课程记录中存储学生人数的计数似乎不是一个可靠的方法。

相关内容

  • 没有找到相关文章

最新更新