Запрос условного обновления Oracle - PullRequest
3 голосов
/ 30 ноября 2011

У меня есть одно требование, как показано ниже:

Предположим, у нас есть таблица EMP с 5 строками, имеющими deptno = 20 - Здесь я получу deptno i.e.20 из входного параметра

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 in (7788,7902); - Здесь empno, т.е. 7788 и 7902, я получу из входного параметра

Мой запрос на обновление должен обновить JOB = 'MANAGER' для 2 строк, имеющих deptno = 20 и для остальных 3 строк я хочу обновить нулевые значения.

Таким образом, конечный результат будет таким, как показано ниже:

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 ]

5 голосов
/ 30 ноября 2011

Попробуйте:

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 голос
/ 30 ноября 2011

Для ясности я бы предпочел решить эту проблему с помощью двух операторов обновления

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;
...