我试图通过提示用户来增加三名员工的薪水。 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;
/
答案 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
语句中进行了处理-如果未进行任何更新,则该员工不存在。另外,如果我是您,我宁愿创建一个存储过程,而不要使用匿名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>