2016-06-17 12 views
3

私は学校の割り当てをしなければならないが、私は2つのエラーを取得:データベースのPL/SQL

遭遇シンボル次のに期待したときに「FETCH」: 一定の例外<an identifier><a double-quoted delimited-identifier>テーブルLONG_ダブルREFの文字

と目が発生しました

NCHARタイムスタンプ 間隔日付バイナリ国語キャラクタEの記号は、「エンド・オブ・ファイル」 のいずれかを期待するときは、次の終了ここでは、静的 メンバーコンストラクタマップ

をオーバーライドし、最終的なインスタンス化の順序をプラグマませんが、私のコードへのリンクです:http://pastebin.com/h4JN9YQY

CREATE OR REPLACE PROCEDURE generate_bonus 
AS 

cursor student_info is 
    select distinct students.id, 
    events.begindatetime, 
    events.enddatetime, 
    count(items.number_of_coupons) as coupons_collected, 
    events.type from students 
    join applies on applies.students_id = students.id 
    join schedules on schedules.id = applies.schedules_id 
    join events on events.id = schedules.events_id 
    join orders on orders.students_id = students.id 
    join orderitems on orderitems.orders_id = orders.id 
    join items on items.id = orderitems.items_id 
    join bars on bars.id = orders.bars_id 
    where applies.status = 'PLANNED' 
    and orderitems."NUMBER" is not null 
    and bars.name is not null 
    group by students.id, events.begindatetime, events.enddatetime, events.type 
    order by students.id; 

BEGIN 

    DECLARE 
    s_id integer(256); 
    s_beginDate date; 
    s_endDate date; 
    s_noCoupons number(256); 
    s_eventType varchar2(256); 
    s_workedHours number(24) := 8; 
    calculated_bonus number(256); 
    count_rows integer(256); 

    OPEN student_info; 

     LOOP 

     FETCH student_info into s_id, s_beginDate, s_endDate, s_noCoupons, s_eventType; 

      Select count(*) into count_rows from student_bonus where students_id = s_id and rownum <= 1; 

     EXIT WHEN count_rows = 1; 

      IF (s_eventType = 'ROUGH') THEN 
       calculated_bonus := s_workedHours * (s_workedHours/100 * 7) * s_noCoupons; 

       INSERT INTO student_bonus(students_id, bonus, events_id) VALUES (s_id, calculated_bonus, s_eventType); 

       calculated_bonus := 0; 

      ELSIF (s_eventType = 'NORMAL') THEN 
       calculated_bonus := s_workedHours * (s_workedHours/100 * 4) * s_noCoupons; 

       INSERT INTO student_bonus(students_id, bonus, events_id) VALUES (s_id, calculated_bonus, s_eventType); 

       calculated_bonus := 0; 

      ELSE 
       calculated_bonus := s_workedHours * (s_workedHours/100 * 2) * s_noCoupons; 

       INSERT INTO student_bonus(students_id, bonus, events_id) VALUES (s_id, calculated_bonus, s_eventType); 

       calculated_bonus := 0; 
      END IF; 

     END LOOP; 

    CLOSE student_info; 

END generate_bonus; 
+0

ここにコードを直接貼り付けてください。 – CinCout

+0

MCVE([MCVE])の作成方法をお読みください。あなたが見せていることは、MCVEの近くにあるものはありそうもありません。 –

+0

count_rowsが0で始まる場合は、おそらくループします。おそらく、count_rows <= 1のときに終了するように変更すると役立ちます – Gar

答えて

0

はるかに簡単。..次のように手順に従ってください。構文のように:

FOR row_variable IN cursor LOOP 
dbms_output.put_line(row_variable.id); 
END LOOP; 

row_variableは、各カーソル行からvaleusを保持し、あなたが簡単にそれをアクセスもできます「」 (ドット)演算子row_variable.idのように カーソルループを使用すると、データをフェッチする際の問題を回避したり、カーソルのオープン/クローズに注意したり、カーソル空間外の出力を心配することはありません。 ループは、各ループのようにカーソルが指しているアイテムの数を正確にループにします。

0

次のように入力してください:

EXIT WHEN student_info%NOTFOUND;

この行の後:

FETCH student_info into s_id, s_beginDate, s_endDate, s_noCoupons, s_eventType; 

あなたはカーソルの最後に達していたが、終了にそれを伝えるコードはありません。

0

カーソルがこのプロジェクトでは、エラーのこの種のを避けるためだろう、カーソルループがあり、使用する後輩のための私の意見で

Open Cursor 
LOOP 
FETCH cursor 
EXIT Cursor condtion 

{-- 
Your rest of the code here 
--} 

end loop;