plsql块增加部门工资

k5hmc34c  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(245)

我必须将10部门员工的工资增加15%,20部门员工的工资增加15%,其他部门员工的工资增加5%,并显示在该部门工作的员工的相应工资。我可以增加10部门和20部门的工资,但我不能将其他部门的工资增加5%。我也试过for循环。这是一个练习题。
我的问题是:(显示dept表中的所有记录。将在deptno 10工作的员工的工资增加15%,deptno 20增加15%,其他增加5%,同时显示在该部门工作的员工的相应工资。使用参数游标和带有update子句的游标。)
我的代码:

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;
pwuypxnk

pwuypxnk1#

别忘了@sticky bit for future的解决方案。
回到您的需求,我相信您坚持使用一个匿名块和参数化游标来完成它
如果是,我会改变以下内容,它应该为您做的工作。
将光标改为below,对于其他人,传递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)
              );

然后再打一次电话给cusrosr,就像你打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;
tjjdgumg

tjjdgumg2#

你根本不需要任何程序代码来做这件事。这只会不必要地严重减慢速度,尤其是使用光标。
而是用一个简单的 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;

相关问题