只是为了增加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;
顺便说一句,我不知道您的数据模型,但是在每个课程记录中存储学生人数的计数似乎不是一种可靠的方法。