2016-10-30 4 views
0

I'am는 PL \ SQL에서 하나 개 이상의 if 조건을 사용하려고 시도하고 나에게 오류 제공 : 여기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

먼저 PL/SQL에서는 "elseif"가 아닌 "elsif"라고 생각합니다. 그렇다면 (이것이 중요한지 아닌지) 잘 모르겠다. 어쩌면 조건 주위에 괄호가 필요할지 모르겠다.

출처 : 당신은 elsif하지 elseifend 후도 ;을 필요 https://www.tutorialspoint.com/plsql/plsql_if_then_elsif.htm

+0

조건은 'then'으로 이미 종료되었으므로 PL/SQL ['if'] (http://docs.oracle.com/database/121/LNPLS/controlstatements.htm#LNPLS391) 조건에서 필요하지 않습니다. . 튜토리얼 스팟 페이지의 저자가 그의 예제를 중복 된 괄호로 쌓아 버린 이유는 신비입니다. 아마도 그는 JavaScript를 생각하고 있었을 것입니다. –

1

. 수정이 하나를 시도

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 
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 나는 당신의 데이터 모델을 모르지만, 각 코스 레코드 내에서 학생의 수를 저장하는 신뢰할 수있는 접근 방식을 보이지 않는다.