plsql - ERROR at line 91: PLS-00103: Encountered the symbol ";" in oracle 10g -
create or replace procedure calculate_curve(e_year in nvarchar2,e_term in smallint,lecture_id in nvarchar2) cursor c1 select student_code, average transcript term=e_term , year=e_year , lecture_code=lecture_id update; student_id nvarchar2(10); avr number; e_grade nvarchar2(3); aa integer; ba integer; bb integer; cb integer; cc integer; dc integer; dd integer; fd integer; avrage number(5,2); sd number(5,2); diff2 number(5,2); n number(5,2); begin select avg(average) avrage transcript term=e_term , year=e_year , lecture_code=lecture_id; select sum(power(average-avrage,2)), count(*) diff2,n transcript term=e_term , year=e_year , lecture_code=lecture_id; if n>=30 n:=n-1; end if; select sqrt(diff2/n) sd dual; open c1; dbms_output.put_line(lecture_id); aa:=avrage+2*sd; if aa>90 aa:=90; ba:=avrage+3*sd/2; if ba>85 ba:=85; bb:=avrage+sd; if bb>80 bb:=80; cb:=avrage+sd/2; if cb>75 cb:=75; cc:=avrage; if cc>70 cc:=70; dc:=avrage-sd/2; if dc>60 dc:=60; dd:=avrage-sd; if dd>50 dd:=50; fd:=avrage-3*sd/2; if fd>40 fd:=40; loop fetch c1 student_id,avr; exit when c1%notfound; if avr>=aa e_grade:='aa'; elsif avr>=ba e_grade:='ba'; elsif avr>=bb e_grade:='bb'; elsif avr>=cb e_grade:='cb'; elsif avr>=cc e_grade:='cc'; elsif avr>=dc e_grade:='dc'; elsif avr>=dd e_grade:='dd'; elsif avr>=fd e_grade:='fd'; else e_grade:='ff'; end if; update transcript set grade=e_grade term=e_term , year=e_year , lecture_code=lecture_id , student_code=student_id; end loop; close c1; end;
the code gives following error message: error @ line 91: pls-00103: encountered symbol ";" oracle mentions before update statement there missing semicolon.in database have transcript table has schema : id,term,lecture_code,student_code,midterm,final,average,grade. note: have examined each select statement externally giving variables needed values no error excited
you opening series of if
statements don't close, if aa>90 then
if fd>40 then
. each of needs own end if;
, after single statement following it, though it's possible intended nesting.
aa:=avrage+2*sd; if aa>90 aa:=90; end if; ba:=avrage+3*sd/2; if ba>85 ba:=85; end if; bb:=avrage+sd; ... fd:=avrage-3*sd/2; if fd>40 fd:=40; end if;
problems bit easier spot if indented code.
when final end;
, compiler telling out of place. can't have plain end
@ point, valid thing start end
end if
close 1 of if
blocks opened earlier.
incidentally, use case
in pace of if
/elsif
construct. , simplify earlier if
blocks bit least
function; instead of:
aa:=avrage+2*sd; if aa>90 aa:=90; end if;
you do:
aa := least(avrage+2*sd, 90);
Comments
Post a Comment