我不确定这是不是比应该循环的更多,或者我的数字是否错了,但它应该是:
如果部门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;
/发布于 2017-05-05 05:40:16
问题在于您的IF。部门检查和薪资检查不应该放在一个IF中。否则,与部门20的一行将转到第一和第三IF的ELSE部分和第二IF的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;
/https://stackoverflow.com/questions/43796009
复制相似问题