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