2016-10-30 12 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」だと思います。そして、(これが重要かどうかは分かりませんが)条件の周りにかっこが必要なのかもしれませんが、わかりません。

出典:https://www.tutorialspoint.com/plsql/plsql_if_then_elsif.htm

+0

PL/SQL ['if'](http://docs.oracle.com/database/121/LNPLS/controlstatements.htm#LNPLS391)の条件では、' 'によって終了されているため、大括弧は不要です。チュートリアルのページの作成者が、括弧で冗長な例題を混乱させたのはなぜか謎です。おそらく彼はJavaScriptを考えていたでしょう。 –

1

あなたはendelsif、ないelseifとも;が必要になります。 修正この方法を試してください。

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ステートメントを2回繰り返すのはなぜですか?また、何もしない行をループしているのはなぜですか?したがって、我々は、ステージ、さらにそれを簡略化することができます。私たちは一発でそれを行うことができるとき

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; 

ところで私はあなたのデータモデルを知らないが、各コースレコード内の学生の数のカウントを格納することは信頼性の高いアプローチを思えません。

関連する問題