PLSQL块增加部门的工资

Posted

技术标签:

【中文标题】PLSQL块增加部门的工资【英文标题】:PLSQL block to increase salary of departments 【发布时间】:2020-08-02 04:32:18 【问题描述】:

我必须将在 deptno 10 工作的员工的薪水增加 15%,Deptno 20 增加 15%,其他人增加 5%,并显示在该部门工作的相应员工。我能够增加部门 10 的薪水和 20 但我无法将其他部门的工资提高 5%。我也尝试过for循环。这是一个练习题。

我的问题是这样的:(显示 Dept 表中的所有记录。将在 deptno 10 工作的员工的薪水增加 15%,Deptno 20 增加 15%,其他人增加 5% 还显示相应的员工在那个部门工作。使用参数 Cursor 和 Cursor with 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;

【问题讨论】:

这必须在 PL/SQL 中完成吗?我可以用纯 SQL 来做吗? 是的,它被指定使用 pl/sql 执行此操作。 【参考方案1】:

您根本不需要任何程序代码来执行此操作。这只会不必要地严重减慢速度,尤其是使用光标。

而只是使用简单的UPDATECASE 表达式返回取决于部门的新工资。

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;

【讨论】:

我必须用 PL/SQL 来回答这个问题。 如果您必须在 PL/SQL 中执行此操作,只需将简单的更新语句包装在 BEGIN .. END 中即可。瞧!您现在拥有 PL/SQL。【参考方案2】:

不要忘记来自 @sticky bit 的解决方案以备不时之需。

回到你的要求,我相信你坚持用一个匿名块和参数化光标来做。(如果我错了,请纠正我)

如果是,我会更改以下内容,它应该为您完成工作。

将光标更改为下方,对于其他人,您将 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 的 cusrosr,

   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;

【讨论】:

我更新后你能看到我的问题吗?你提供的这个解决方案对我有用。 @mayank:当我看到您更新的问题时,要求还显示“带有更新子句的光标”。我不确定这个更新子句是否引用了开始端的更新语句或类似techonthenet.com/oracle/cursors/current_of.php.... 因为当两个并发用户更新相同的记录时,我们实际上可以使用带有更新子句的游标来处理锁定。有关详细信息,请参阅我提供的链接。

以上是关于PLSQL块增加部门的工资的主要内容,如果未能解决你的问题,请参考以下文章

oracle---plsql---示例laobai

PLSQL 的简单命令之二

oracle中plsql练习题----查询姓为“SMITH”的员工信息,并输出其员工号姓名工资部门号。 – –如果该员工不存在,则插入一条新记录,员工号为2012,员工姓名为“Smith”,工(代码

oracle创建触发器

PLSQL新工资不显示或显示错误

SQL数据库 计算出每个部门的平均工资 最高工资和最低工资 语法怎么写?