if语句有什么问题?

时间:2016-10-30 22:09:09

标签: oracle plsql ora-06550

我正试图在PL \ SQL中使用多个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
你能告诉我错误在哪里吗? 感谢。

3 个答案:

答案 0 :(得分:4)

首先,我认为在PL / SQL中它是“elsif”而不是“elseif”。然后(我不知道这是否重要),也许你需要围绕条件的括号,我不知道。

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

答案 1 :(得分:1)

elsif之后,您需要elseif,而非;end。 试试这个更正:

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 

答案 2 :(得分:1)

只是添加到massko的答案 -

普通Cursor FOR loop比显式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;

btw我不知道您的数据模型,但是在每个课程记录中存储学生数量的计数似乎不是一种可靠的方法。