2017-05-05 9 views
1

これ以上のループが発生している場合や、数値が間違っている場合はわかりませんが、それは次のようになります。これは私が望むよりも高い金額を出力している理由は何ですか?

IF deptが10で給与が2000より大きい場合は、 7%の引き上げ。 IF部門が20人、給与が2500人を超える場合は5%の引き上げを行い、それ以外の場合は5.5%の引き上げを行います。 IF部門が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との行は、第1及び第3のIF年代のELSE部および第二IFIF部に行くであろう。次のコードは動作します。

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

大変ありがとうございました。私はこのサイトに少し新しくなっていますが、私はあなたの答えを「受け入れる」ことで、これを閉じることができますか? –

+0

は答えの左の目盛りがあります@JBen。クリックするだけです。それは緑色になるでしょう。 – Nitish

関連する問題