Поскольку вы не предоставили тестовый пример, я использую схему Скотта и его таблицу EMP. Принцип тот же, хотя.
Посмотрите на этот пример и обратите внимание на различия:
CASE
Вы написали неправильно; вы уже сказали, что NewSalary должен быть что-то (в пределах UPDATE
), поэтому вы не будете повторять это снова)
ELSE
не может быть «Неверный идентификатор»; Вы бы поместили строку в столбец типа данных NUMBER
. Я обработал это в выражении IF
- если ничего не было обновлено, такого сотрудника не существует.
- вы не можете выводить NewSalary, поскольку вы этого не знаете. Я вернул его значение в отдельную локальную переменную (l_new_sal)
Кроме того, на вашем месте я бы предпочел создать хранимую процедуру вместо использования анонимного блока PL / SQL. Если вы используете его в образовательных целях, пусть будет (но вы можете попытаться преобразовать его в процедуру, если хотите).
Вот, пожалуйста; один пример с несуществующим EMPNO
, а другой для сотрудника, который существует.
SQL> set serveroutput on
SQL> set ver off
SQL> accept par_selection prompt 'Enter EMPNO: '
Enter EMPNO: 1234
SQL> declare
2 l_empno emp.empno%type := &par_selection; -- it is employee ID, not job number!
3 l_new_sal emp.sal%type;
4 l_cnt number;
5 begin
6 update emp e set
7 e.sal = case when e.deptno = 10 then e.sal * 1.1
8 when e.deptno = 20 then e.sal * 1.15
9 when e.deptno = 30 then e.sal * 1.2
10 else e.sal
11 end
12 where e.empno = l_empno
13 returning sal into l_new_sal;
14
15 l_cnt := sql%rowcount;
16
17 if l_cnt > 0 then
18 dbms_output.put_line('Employee ' || l_empno || ', new salary = ' || l_new_sal);
19 else
20 dbms_output.put_line('Nobody got new salary');
21 end if;
22 end;
23 /
Nobody got new salary
PL/SQL procedure successfully completed.
SQL> accept par_selection prompt 'Enter EMPNO: '
Enter EMPNO: 7369
SQL> /
Employee 7369, new salary = 920
PL/SQL procedure successfully completed.
SQL>