Plsql For循环和嵌套If循环

Plsql For循环和嵌套If循环,plsql,Plsql,不知道此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) TH

不知道此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;
/
打开服务器输出
声明
光标EMP_更新为
选择EMP_ID、姓名、职务、工资、等级
来自雇员1;
开始
对于EMP_更新循环中的REC

如果REC.EMP_ID,以下是语法问题:

  • 使用
    ELSIF
    而不是
    ELSE IF
  • 去掉
    MAX(REC.EMP\u ID)
    行。不能对这样的游标执行聚合,它必须是SQL语句的一部分。但你不需要这么做 不管怎样,还是要这样做。当不再有行时,循环光标将自动停止
以下是一些通用编程建议:

  • 样式和格式很重要。它们将帮助您和其他人理解代码
  • 始终以尽可能小的代码开始,并在遇到单个错误时停止。调试复杂性随着bug的数量呈指数增长

您将遇到编译错误。 不需要多个端如果

正确的查询:

    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;
声明
光标EMP_更新为
选择EMP_ID、姓名、职务、工资、等级
来自员工1的更新信息;
开始
对于EMP_更新循环中的REC

如果REC.EMP_ID欢迎使用堆栈溢出!声明应该做什么而不是做什么?请将其编辑到您的问题中。您的错误是什么?请先学习基本语法。