2011-11-30 180 views
3

我有一个要求,如下所示:甲骨文条件更新查询

假设我们有EMP表与具有DEPTNO 5列= 20 --Here我将得到从输入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 

现在我想写入过程一个UPDATE查询将更新EMP表 组JOB =“MANAGER”,其中在EMPNO(7788,7902); - 这里EMPNO即7788和7902我会得到输入参数

我的更新查询应该更新JOB =“MANAGER”具有DEPTNO = 20 2排和第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

你说你会得到empno作为输入参数。你的输入参数遵循什么格式?它是一个CSV列表吗?一个PL/SQL表? IOW,你如何接受多个empno值? – DCookie

回答

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; 

希望这为w帽子你是后...

编辑:在您的关于输入从数表型是这样来评论应该工作:

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; 
/
+0

对不起,我忘了在例子中提到一件事,我以集合的形式获取我的输入参数。所以在这种情况下,我不能写简单的case语句。因此,我必须使用一些循环,而不是直接使用case语句,当出现问题的语句 – user1017936

+0

确定,输入参数是什么类型的集合? – Ollie

+0

其编号 – user1017936

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; 
+1

汤姆凯特建议使用CASE超过解码 - “解码是有点模糊 - CASE是非常非常明确的 的事情,很容易在解码做很容易在CASE做,事情是。硬或接近 不可能与解码做很容易,以防万一。CASE,逻辑明智,胜手往下做。” – Ollie

+0

Yupp,'case'比'decode'更可取,我同意这一点。然而,我的观点是,在某些情况下,除非你有绩效考虑,否则都不鼓励。特别是当您的SQL由中间件应用程序生成时,通过两次单独更新来更加清晰。 – bpgergo

+0

我仍然希望在一次更新中完成该工作,减少要完成的工作,减少上下文切换次数,保持一条语句等。 – Ollie