PL / SQL-WHEN / Условные команды - PullRequest
       7

PL / SQL-WHEN / Условные команды

0 голосов
/ 14 сентября 2018

Я пытаюсь увеличить зарплату трех сотрудников, предложив пользователю.Для job_ids заданы значения 1, 4 и 8. Я не могу заставить свои утверждения WHEN работать или правильно взаимодействовать с таблицами данных.У кого-нибудь есть идеи?

    SET SERVEROUTPUT ON
    SET VERIFY OFF

    accept selection prompt 'Please enter your employee ID'

    DECLARE

    JobNumber INT(2) := ('&selection.');

    NewSalary VARCHAR2(30);

   BEGIN

    update emp_employee
    set NewSalary = case
        WHEN JobNumber = '1' THEN NewSalary := emp_employees.salary * 1.10;
        WHEN JobNumber = '4' THEN NewSalary := emp_employees.salary * 1.15;
        WHEN JobNumber = '8' THEN NewSalary := emp_employees.salary * 1.20;
        ELSE 'Invalid ID'
        END;
   DBMS_OUTPUT.PUT_LINE ('Job ID '|| JobNumber || 'Salary ' || NewSalary);

  END;

  /

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Поскольку вы не предоставили тестовый пример, я использую схему Скотта и его таблицу 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>
0 голосов
/ 14 сентября 2018

я думаю, что ваше обновление должно быть как показано ниже

   update emp_employee
        set NewSalary = case
            WHEN JobNumber = 1 THEN  emp_employees.salary * 1.10;
            WHEN JobNumber = 4 THEN  emp_employees.salary * 1.15;
            WHEN JobNumber = 8 THEN emp_employees.salary * 1.20;
            ELSE null
            END;

// NewSalary - числовое поле, которому нельзя присвоить строковое значение invalid

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...