Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle条件更新查询_Oracle_Procedure - Fatal编程技术网

Oracle条件更新查询

Oracle条件更新查询,oracle,procedure,Oracle,Procedure,我有一个要求,如下所示: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO -------------------------------------------------------------------------------- 7566 JONES 7839 04/02/1981 2975 - 20 7788 SCOTT MANAGER 75

我有一个要求,如下所示:

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 
假设我们有5行的EMP表,deptno=20——这里我将从输入参数中获取deptno,即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 
现在我想在更新EMP表的过程中编写一个更新查询 设置作业='MANAGER',其中empno位于(77887902);--此处empno,即7788和7902,我将从输入参数中获取

我的更新查询应该为deptno=20的两行更新JOB='MANAGER' 对于我要更新的其余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 
那么,编写此查询的最佳方法是什么呢

UPDATE emp
   SET job = (CASE empno
                 WHEN 7788
                 THEN 'MANAGER'
                 WHEN 7902
                 THEN 'MANAGER'
                 ELSE NULL
               END)
 WHERE deptno = 20;

希望这就是你想要的

编辑:在您对来自数字表的输入进行评论后,键入以下内容:

CREATE TYPE number_tab
AS TABLE OF NUMBER
/
创建的类型


为了清楚起见,我更愿意用两个update语句来解决这个问题

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;

Tom Kyte建议使用CASE over decode——“解码有点模糊——CASE非常清楚。解码中容易做的事情在CASE中也很容易做,解码中难以或几乎不可能做的事情在CASE中也很容易做。CASE,逻辑方面,轻而易举地获胜。”,
case
优于
decode
,我同意这一点。然而,我的观点是,在某些情况下,除非考虑性能,否则这两种方法都是不可取的。特别是当您的SQL是由中间件应用程序生成的时候,更清楚的是通过两个单独的更新来实现这一点。我仍然更喜欢在一个更新中完成,更少的工作要做,更少的上下文切换,一个要维护的语句等。您说您将获得empno作为输入参数。您的输入参数遵循什么格式?是CSV列表吗?PL/SQL表?你们如何接受多个empno值?很抱歉,我忘了在示例中提到一件事,我正在以集合的形式获取输入参数。所以在这个场景中,我无法编写简单的case语句。因此,我必须使用一些循环,而不是直接使用case-when语句来产生问题。OK,您的输入参数是什么类型的集合?它的用户声明的数字表类型OK,请参阅我的答案的新编辑。你将不得不为你的确切场景而玩弄它,但它应该非常接近。
UPDATE emp SET job = DECODE(empno, 7788, 'MANAGER', 7902, 'MANAGER', null)
WHERE deptno = 20;