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