2011-11-30 185 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