ПЛ SQL блок повышения заработной платы отделов - PullRequest
0 голосов
/ 02 августа 2020

Я должен увеличить зарплату сотрудников, работающих в департаменте 10 на 15%, департаменте 20 на 15% и других на 5% и отобразить соответствующие сотрудники, работающие в этом департаменте. Я могу увеличить зарплату сотрудников отдела mnet 10 и 20, но я не могу увеличить зарплату других отделов на 5%. Я тоже пробовал использовать для l oop. Это практический вопрос.

Мой вопрос таков: ( Показать все записи из таблицы Dept. Увеличить зарплату сотрудников, работающих в deptno 10 на 15%, Deptno 20 на 15% и другие на 5% Также отобразить соответствующих сотрудников, работающих в этом отделе. Используйте параметр Cursor и Cursor with Update clause. )

MY code:

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;

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Для этого вам вообще не нужен какой-либо процедурный код. Это просто излишне и сильно замедлит его, особенно использование курсоров.

Вместо этого просто используйте простой 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;
1 голос
/ 02 августа 2020

Не забудьте решение из @ липкого бита на будущее.

Возвращаясь к вашему требованию, я считаю, что вы придерживаетесь этого с одним анонимным блоком и с параметризованным курсором. (исправьте меня, если я ошибаюсь)

если да, я бы изменил следующее, и он должен работать за вас.

Измените курсор на ниже, для других вы передаете null в качестве параметра и в предложении where мы можем обработать то же самое. (когда значение передается как 10 или 20, он будет сравнивать, а при нулевом значении он будет обновляться для всех, кроме 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;
...