我要把部门内10名员工的工资提高15%,部门20名增加15%,其他人增加5%,并显示该部门的相应雇员。我可以增加第10和20号部门的薪金,但我不能把其他部门的薪金提高5%。我尝试过使用for循环too.This是一个实践问题。
我的问题是:(显示Dept表中的所有记录。部门工作人员的工资增加15%,部门20人增加15%,其他人增加5%,也显示在该部门工作的相应雇员。使用参数游标和游标与更新子句.)
我的代码:
declare
cursor sal_increase(v_dno number) is select empno,sal,ename,deptno from emp where deptno=v_dno ;
emp_record sal_increase%rowtype;
begin
OPEN sal_increase(10);
LOOP
FETCH sal_increase INTO emp_record;
EXIT WHEN sal_increase%NOTFOUND;
update emp set sal=sal+sal*0.15 where empno=emp_record.empno;
DBMS_OUTPUT.PUT_LINE(emp_record.ename||' '||emp_record.deptno);
END LOOP;
CLOSE sal_increase;
OPEN sal_increase(20);
LOOP
FETCH sal_increase INTO emp_record;
EXIT WHEN sal_increase%NOTFOUND;
update emp set sal=sal+sal*0.15 where empno=emp_record.empno;
DBMS_OUTPUT.PUT_LINE(emp_record.ename||' '||emp_record.deptno);
END LOOP;
CLOSE sal_increase;
end;发布于 2020-08-02 05:45:12
不要忘记来自@粘滞位的未来解决方案。
回到您的要求,我相信您坚持使用一个匿名块和参数化游标。(如果我错了,请纠正我)
如果是的话,我会修改以下内容,它应该为你做工作。
将光标更改为下面,对于其他人,将null作为参数传递,在where子句中,我们可以处理相同的子句。(当值传递为10或20时,它将进行比较,当null时,它将更新除10和20以外的所有值)
CURSOR sal_increase(v_dno NUMBER) IS
SELECT empno
,sal
,ename
,deptno
FROM emp
WHERE ( v_dno IS NOT NULL AND deptno = v_dno
OR v_dno IS NULL AND deptno NOT IN (10,20)
);然后再次调用垫子,就像你对10和20做的那样,
OPEN sal_increase(v_dno => NULL);
LOOP
FETCH sal_increase
INTO emp_record;
EXIT WHEN sal_increase%NOTFOUND;
UPDATE emp SET sal = sal * 0.05 WHERE empno = emp_record.empno;
dbms_output.put_line(emp_record.ename || ' ' || emp_record.deptno);
END LOOP;
CLOSE sal_increase;发布于 2020-08-02 04:45:23
你根本不需要任何程序代码来做到这一点。这将不必要地严重拖慢它,特别是游标的使用。
相反,只需使用一个简单的UPDATE,其中包含一个CASE表达式,根据部门的不同返回新的薪资。
UPDATE emp
SET sal = CASE
WHEN deptno IN (10, 20) THEN
sal * 0.15
ELSE
sal * 0.05
END;对于输出,只需使用SELECT。
SELECT ename || ' ' || deptno
FROM emp;https://stackoverflow.com/questions/63212411
复制相似问题