2017-05-05 22 views
1

我不知道這是否只是循環超過它應該或如果我的數字是錯誤的,但它應該是:這是輸出一個比我想要的更高的金額的任何理由?

如果部門是10,薪水大於2000給予6%的增加,否則給予提高7%。如果部門是20,薪水大於2500,則提高5%,否則提高5.5%。如果部門是30,薪水大於1000,則提高7%,否則提高6.5%。

下面的代碼:

DECLARE 
    v_deptno  empbackup.deptno%TYPE; 
    v_sal   empbackup.sal%TYPE; 
    CURSOR raise IS 
     SELECT deptno, sal 
     FROM empbackup 
     FOR UPDATE OF sal; 

BEGIN 
    OPEN raise; 
    FETCH raise INTO v_deptno, v_sal; 

    WHILE raise%FOUND LOOP 
     IF v_deptno = 10 AND v_sal > 2000 THEN 
      v_sal := v_sal * 1.06; 
     ELSE 
      v_sal := v_sal * 1.07; 
     END IF; 

     IF v_deptno = 20 AND v_sal > 2500 THEN 
      v_sal := v_sal * 1.05; 
     ELSE 
      v_sal := v_sal * 1.055; 
     END IF; 

     IF v_deptno = 30 AND v_sal > 1000 THEN 
      v_sal := v_sal * 1.07; 
     ELSE 
      v_sal := v_sal * 1.065; 
     END IF; 

     UPDATE empbackup 
     SET sal = v_sal 
     WHERE CURRENT OF raise; 

     FETCH raise INTO v_deptno, v_sal; 
    END LOOP; 

    CLOSE raise; 
END; 
/
+0

請正確標記。這是MySQL還是Oracle?不能都是 –

+0

您能否提供代碼不返回期望值的測試數據? – kpater87

+0

調查PL/SQL調試器的時間。順便說一句,你可以簡化這個代碼[遊標FOR循環](http://docs.oracle.com/database/121/LNPLS/cursor_for_loop_statement.htm)。 –

回答

3

問題是與你的IF的。部門檢查和工資檢查不應該在一個IF。否則,具有部門20的行將去往ELSE部分的第一和第三IFIF部分的第二IF。以下代碼將起作用。

DECLARE 
    v_deptno empbackup.deptno%TYPE; 
    v_sal  empbackup.sal%TYPE; 

    CURSOR raise 
    IS 
      SELECT deptno, sal 
      FROM empbackup 
     FOR UPDATE OF sal; 
BEGIN 
    OPEN raise; 

    FETCH raise 
    INTO v_deptno, v_sal; 

    WHILE raise%FOUND 
    LOOP 
     IF v_deptno = 10 
     THEN 
     IF v_sal > 2000 
     THEN 
      v_sal := v_sal * 1.06; 
     ELSE 
      v_sal := v_sal * 1.07; 
     END IF; 
     END IF; 

     IF v_deptno = 20 
     THEN 
     IF v_sal > 2500 
     THEN 
      v_sal := v_sal * 1.05; 
     ELSE 
      v_sal := v_sal * 1.055; 
     END IF; 
     END IF; 

     IF v_deptno = 30 
     THEN 
     IF v_sal > 1000 
     THEN 
      v_sal := v_sal * 1.07; 
     ELSE 
      v_sal := v_sal * 1.065; 
     END IF; 
     END IF; 

     UPDATE empbackup 
     SET sal = v_sal 
     WHERE CURRENT OF raise; 

     FETCH raise 
     INTO v_deptno, v_sal; 
    END LOOP; 

    CLOSE raise; 
END; 
/
+0

非常感謝你Nitish。我對這個網站有點新,我該如何「接受」你的答案,這樣可以結束? –

+0

@JBen答案左側會有一個刻度線。你只需要點擊它。它會變綠。 – Nitish

相關問題