Вы можете избежать выбора текущей зарплаты в локальную переменную и обновлять ее напрямую. Для более красивого вывода я объявил RETVAL
, который будет использоваться для отображения новой зарплаты.
Вот пример: во-первых, я создам временную таблицу на основе таблицы EMP Скотта (чтобы она выглядела как ваша):
SQL> create table t_emp as
2 select empno as employee_id,
3 sal as salary
4 from emp;
Table created.
Процедура: полезная часть - строки 5 - 9, которые делают то, что вы хотели. Остальное не обязательно.
В строках 12-16 я проверяю, было ли что-либо обновлено (т. Е. Сотрудник с P_NO
существует - обратите внимание, что мне не нужен обработчик исключений для NO_DATA_FOUND
в этом случае).
SQL> create or replace procedure procempno (p_no in number)
2 is
3 retval t_emp.salary%type;
4 begin
5 update t_emp e set
6 e.salary = case when e.salary > 1000 then e.salary * 1.75
7 else 5000
8 end
9 where e.employee_id = p_no
10 returning e.salary into retval;
11
12 if sql%rowcount = 0 then
13 dbms_output.put_line(p_no || ' does not exist');
14 else
15 dbms_output.put_line('Salary updated to ' || retval);
16 end if;
17 end;
18 /
Procedure created.
SQL>
Тестирование:
SQL> set serveroutput on
SQL> begin procempno(7369); end;
2 /
Salary updated to 5000
PL/SQL procedure successfully completed.
SQL> begin procempno(7499); end;
2 /
Salary updated to 2800
PL/SQL procedure successfully completed.
SQL> begin procempno(1111); end;
2 /
1111 does not exist
PL/SQL procedure successfully completed.
SQL>