我有一个要求如下所示:
假设我们有EMP表,其中5行有deptno = 20 - 这是我将从输入参数得到deptno ie20
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------------------------------------------------------------------------------
7566 JONES MANAGER 7839 04/02/1981 2975 - 20
7788 SCOTT ANALYST 7566 12/09/1982 3000 - 20
7902 FORD ANALYST 7566 12/03/1981 3000 - 20
7369 SMITH CLERK 7902 12/17/1980 800 - 20
7876 ADAMS CLERK 7788 01/12/1983 1100 - 20
现在我想在程序中编写一个更新EMP表的UPDATE查询 设置JOB ='MANAGER',其中empno in(7788,7902); - 这里是empno,即7788和7902,我将从输入参数
获得我的更新查询应该为deptno = 20的2行更新JOB ='MANAGER' 对于我想要更新的3行的剩余部分将是Null值。
所以最终输出如下所示:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------------------------------------------------------------------------------
7566 JONES 7839 04/02/1981 2975 - 20
7788 SCOTT MANAGER 7566 12/09/1982 3000 - 20
7902 FORD MANAGER 7566 12/03/1981 3000 - 20
7369 SMITH 7902 12/17/1980 800 - 20
7876 ADAMS 7788 01/12/1983 1100 - 20
那么编写此查询的最佳方式是什么
答案 0 :(得分:5)
尝试:
UPDATE emp
SET job = (CASE empno
WHEN 7788
THEN 'MANAGER'
WHEN 7902
THEN 'MANAGER'
ELSE NULL
END)
WHERE deptno = 20;
或者
UPDATE emp
SET job = (CASE
WHEN empno IN (7788, 7902)
THEN 'MANAGER'
ELSE NULL
END)
WHERE deptno = 20;
希望这就是你所追求的......
编辑:在您对来自数字表类型的输入发表评论后,类似这样的内容应该有效:
CREATE TYPE number_tab
AS TABLE OF NUMBER
/
创建类型。
CREATE OR REPLACE
PROCEDURE upd_emp (
p_deptno IN emp.deptno%TYPE,
p_empno_tab IN number_tab
)
IS
BEGIN
UPDATE emp e
SET e.job = (SELECT (CASE
WHEN t.column_value IS NULL
THEN NULL
ELSE 'MANAGER'
END)
FROM TABLE(p_empno_tab) t
WHERE t.column_value(+) = e.empno)
WHERE deptno = p_deptno;
EXCEPTION
WHEN others
THEN
...Exception handling code
END upd_emp;
/
答案 1 :(得分:1)
为清楚起见,我宁愿用两个更新语句解决这个问题
UPDATE emp SET job = null
WHERE deptno = 20
AND empno NOT IN (7788, 7902);
UPDATE emp SET job = 'MANAGER'
WHERE deptno = 20
AND empno IN (7788, 7902);
如果您想将其置于一个更新中,您可以这样:
UPDATE emp SET job = DECODE(empno, 7788, 'MANAGER', 7902, 'MANAGER', null)
WHERE deptno = 20;