0

我试图在 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

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

4

3 回答 3

4

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

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

于 2016-10-30T22:19:07.780 回答
1

只是为了增加massko的答案-

普通的Cursor 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;

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

于 2016-10-31T11:08:27.893 回答
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 
于 2016-10-31T08:23:26.847 回答