我正试图在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
你能告诉我错误在哪里吗?
感谢。
答案 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我不知道您的数据模型,但是在每个课程记录中存储学生数量的计数似乎不是一种可靠的方法。