不知道这个plsql语句有什么问题:
SET SERVEROUTPUT ON
DECLARE
CURSOR EMP_UPDATE IS
SELECT EMP_ID ,NAME ,DESIGNATION ,SALARY ,GRADE
FROM EMPLOYEE1;
BEGIN
FOR REC IN EMP_UPDATE LOOP
IF REC.EMP_ID <= MAX(REC.EMP_ID)
THEN
IF REC.NAME IS NOT NULL
THEN
IF REC.SALARY <= 1000
THEN
UPDATE EMPLOYEE1 SET GRADE = 'D' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY BETWEEN 1001 AND 5000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'C' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY BETWEEN 5001 AND 10000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'B' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY BETWEEN 10000 AND 20000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'A' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY > 20000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'S' WHERE EMP_ID = REC.EMP_ID;
ELSE
UPDATE EMPLOYEE1 SET REC.NAME = (SELECT NAME FROM EMPL_DATABASE ED WHERE ED.EMP_ID = REC.EMP_ID) WHERE EMP_ID = REC.EMP_ID;
END IF;
END IF;
END IF;
END LOOP;
END;
/
答案 0 :(得分:0)
以下是语法问题:
ELSIF
代替ELSE IF
。MAX(REC.EMP_ID)
行。您不能像这样对游标执行聚合,它必须是SQL语句的一部分。但你不需要
无论如何要这样做。当没有更多行时,游标for循环将自动停止。以下是一些通用的编程建议:
答案 1 :(得分:0)
您将遇到编译错误。 不需要多个结束if;
更正查询:
DECLARE
CURSOR EMP_UPDATE IS
SELECT EMP_ID ,NAME ,DESIGNATION ,SALARY ,GRADE
FROM EMPLOYEE1 for update ;
BEGIN
FOR REC IN EMP_UPDATE LOOP
IF REC.EMP_ID <= MAX(REC.EMP_ID) and REC.NAME IS NOT NULL and REC.SALARY <= 1000
THEN
UPDATE EMPLOYEE1 SET GRADE = 'D' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY BETWEEN 1001 AND 5000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'C' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY BETWEEN 5001 AND 10000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'B' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY BETWEEN 10000 AND 20000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'A' WHERE EMP_ID = REC.EMP_ID;
ELSE IF REC.SALARY > 20000 THEN
UPDATE EMPLOYEE1 SET GRADE = 'S' WHERE EMP_ID = REC.EMP_ID;
ELSE
UPDATE EMPLOYEE1 SET REC.NAME = (SELECT NAME FROM EMPL_DATABASE ED WHERE ED.EMP_ID = REC.EMP_ID) WHERE EMP_ID = REC.EMP_ID;
END IF;
END LOOP;
END;