Plsql For循环和嵌套的If循环

时间:2015-01-18 06:18:06

标签: 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) 
            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;
/

2 个答案:

答案 0 :(得分:0)

以下是语法问题:

  • 使用ELSIF代替ELSE IF
  • 摆脱MAX(REC.EMP_ID)行。您不能像这样对游标执行聚合,它必须是SQL语句的一部分。但你不需要 无论如何要这样做。当没有更多行时,游标for循环将自动停止。

以下是一些通用的编程建议:

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

答案 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;