Oracle条件更新查询

时间:2011-11-30 16:18:54

标签: oracle procedure

我有一个要求如下所示:

假设我们有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 

那么编写此查询的最佳方式是什么

2 个答案:

答案 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;