Plsql 第91行错误:PLS-00103:在oracle 10g中遇到“;”符号

Plsql 第91行错误:PLS-00103:在oracle 10g中遇到“;”符号,plsql,oracle10g,procedure,Plsql,Oracle10g,Procedure,代码给出以下错误消息:第91行错误:PLS-00103:遇到符号;oracle提到在update语句之前缺少一个分号。在我的数据库中,我有一个成绩单表,它的模式如下:ID、学期、讲座代码、学生代码、期中、期末、平均、成绩。 注意:我通过给变量提供所需的值,从外部检查了每个select语句,因此没有引起错误您正在打开一系列未关闭的IF语句,从IF AA>90到IF FD>40。每一个都需要自己的目的,如果;,可能紧跟在它后面的一条语句之后,尽管您可能打算进行一些嵌套 CREATE OR REP

代码给出以下错误消息:第91行错误:PLS-00103:遇到符号;oracle提到在update语句之前缺少一个分号。在我的数据库中,我有一个成绩单表,它的模式如下:ID、学期、讲座代码、学生代码、期中、期末、平均、成绩。
注意:我通过给变量提供所需的值,从外部检查了每个select语句,因此没有引起错误

您正在打开一系列未关闭的IF语句,从IF AA>90到IF FD>40。每一个都需要自己的目的,如果;,可能紧跟在它后面的一条语句之后,尽管您可能打算进行一些嵌套

  CREATE OR REPLACE PROCEDURE CALCULATE_CURVE(E_YEAR IN NVARCHAR2,E_TERM IN  SMALLINT,LECTURE_ID IN NVARCHAR2)                                         
   IS CURSOR C1 IS 
   SELECT STUDENT_CODE, AVERAGE
   FROM TRANSCRIPT
   WHERE TERM=E_TERM AND YEAR=E_YEAR AND LECTURE_CODE=LECTURE_ID
   FOR 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) INTO AVRAGE
   FROM TRANSCRIPT 
   WHERE TERM=E_TERM AND YEAR=E_YEAR AND LECTURE_CODE=LECTURE_ID;
   SELECT SUM(POWER(AVERAGE-AVRAGE,2)), COUNT(*) INTO DIFF2,N
   FROM TRANSCRIPT 
   WHERE TERM=E_TERM AND YEAR=E_YEAR AND LECTURE_CODE=LECTURE_ID;
   IF N>=30 THEN
   N:=N-1;
   END IF;
   SELECT SQRT(DIFF2/N) INTO SD FROM DUAL;
   OPEN C1;
   DBMS_OUTPUT.PUT_LINE(LECTURE_ID);
   AA:=AVRAGE+2*SD;
   IF AA>90 THEN 
   AA:=90;
   BA:=AVRAGE+3*SD/2;
   IF BA>85 THEN
   BA:=85; 
   BB:=AVRAGE+SD;
   IF BB>80 THEN
   BB:=80; 
   CB:=AVRAGE+SD/2;
   IF CB>75 THEN
   CB:=75;    
   CC:=AVRAGE;
   IF  CC>70 THEN
   CC:=70;  
   DC:=AVRAGE-SD/2;
   IF DC>60 THEN
   DC:=60;  
   DD:=AVRAGE-SD;
   IF DD>50 THEN
   DD:=50;  
   FD:=AVRAGE-3*SD/2;
   IF FD>40 THEN
   FD:=40;
   LOOP

   FETCH C1 INTO STUDENT_ID,AVR;
   EXIT WHEN C1%NOTFOUND;
   IF AVR>=AA THEN
   E_GRADE:='AA';
   ELSIF AVR>=BA THEN
   E_GRADE:='BA';
   ELSIF AVR>=BB THEN
   E_GRADE:='BB';
   ELSIF AVR>=CB THEN
   E_GRADE:='CB';
   ELSIF AVR>=CC THEN
   E_GRADE:='CC';
   ELSIF AVR>=DC THEN
   E_GRADE:='DC';
   ELSIF AVR>=DD THEN
   E_GRADE:='DD';
   ELSIF AVR>=FD THEN
   E_GRADE:='FD';
   ELSE
   E_GRADE:='FF';
   END IF;

   UPDATE TRANSCRIPT 
   SET GRADE=E_GRADE
   WHERE TERM=E_TERM AND YEAR=E_YEAR AND LECTURE_CODE=LECTURE_ID AND         STUDENT_CODE=STUDENT_ID;

   END LOOP;
   CLOSE C1;
  END;       
如果缩进代码,这样的问题会更容易发现

当你到达终点时;,编译器告诉您它不合适。在这一点上不可能有一个简单的结束,唯一有效的开始是结束IF,以关闭之前打开的IF块之一

顺便说一句,您可以在IF/ELSIF构造中使用用例。你可以用最少的函数简化前面的IF块;而不是:

   AA:=AVRAGE+2*SD;
   IF AA>90 THEN 
     AA:=90;
   END IF;
   BA:=AVRAGE+3*SD/2;
   IF BA>85 THEN
     BA:=85; 
   END IF;
   BB:=AVRAGE+SD;
   ...
   FD:=AVRAGE-3*SD/2;
   IF FD>40 THEN
     FD:=40;
   END IF;
你可以做:

   AA:=AVRAGE+2*SD;
   IF AA>90 THEN 
     AA:=90;
   END IF;

很简单,它能工作…非常感谢@亚历克斯·普尔:这段代码是从MicrosoftSQLServerSytax到oracle语法编辑的,我遇到了太多冲突
    AA := LEAST(AVRAGE+2*SD, 90);