PL / SQL- WHEN /条件命令

时间:2018-09-14 00:01:51

标签: oracle plsql

我试图通过提示用户来增加三名员工的薪水。 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 :(得分:0)

我认为您的更新应如下所示

   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

答案 1 :(得分:0)

由于您没有提供测试用例,因此我正在使用Scott的架构和他的EMP表。原理是一样的。

看看这个例子,并注意不同之处:

    您写的
  • CASE是错误的;您已经说过NewSalary应该是 (在UPDATE内),因此您不必再重复一次了。
  • ELSE不能为“无效ID”;您需要将一个字符串放入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>