단지의 답변을 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 나는 당신의 데이터 모델을 모르지만, 각 코스 레코드 내에서 학생의 수를 저장하는 신뢰할 수있는 접근 방식을 보이지 않는다.
조건은 'then'으로 이미 종료되었으므로 PL/SQL ['if'] (http://docs.oracle.com/database/121/LNPLS/controlstatements.htm#LNPLS391) 조건에서 필요하지 않습니다. . 튜토리얼 스팟 페이지의 저자가 그의 예제를 중복 된 괄호로 쌓아 버린 이유는 신비입니다. 아마도 그는 JavaScript를 생각하고 있었을 것입니다. –