语法

UPDATE [ optimizer_hint ] table[subquery][@dblink ]
    SET column = { expression | DEFAULT } [, ...]
  [ WHERE condition ]
  [ RETURNING return_expression [, ...]
      { INTO { record | variable [, ...] }
      | BULK COLLECT INTO collection [, ...] } ]

UPDATE 更改满足条件的所有行中指定列的值。只需在 SET 子句中提及要修改的列;未显式修改的列保留其先前的值。

只能在 SPL 程序中指定 RETURNING INTO { record | variable [, ...] } 子句。此外, UPDATE 命令的结果集不能返回多个行,否则将引发异常。如果结果集为空,则将目标记录或变量的内容设置为 null。

只有在 SPL 程序中使用 UPDATE 命令时,才能指定 RETURNING BULK COLLECT INTO collection [, ...] 子句。如果将多个 collection 指定为 BULK COLLECT INTO 子句的目标,则每个 collection 必须包含一个标量字段,即 collection 不得为记录。 UPDATE 命令的结果集可以包含零个、一个或多个行。针对结果集的每一行, return_expression 的求值结果成为 collection 中的元素,从第一个元素开始。会删除 collection 中的所有现有行。如果结果集为空,则 collection 也将为空。

必须对表具有 UPDATE 特权才能更新表,还必须对在 expression condition 中读取其值的任何表具有 SELECT 特权。 return_expression 可能包括表中一列或多列的表达式。如果在 return_expression 中指定表中的列名,则按如下方式确定在对 return_expression 求值时替换该列的值:

  • 如果在 UPDATE 命令中为 return_expression 中指定的列分配一个值,则在计算 return_expression 时使用指定的值。
  • 如果未在 UPDATE 命令中为 return_expression 中指定的列分配值,则受影响的行中列的当前值将用于计算 return_expression 。 collection 根据 return_expression 求值结果在其中创建元素的集合。可能存在单个集合(该集合可能是由单个字段组成的集合,也可能是由记录类型组成的集合),也可能存在多个集合(在这种情况下,每个集合必须由单个字段组成)。返回表达式的数量和顺序必须与所有指定集合中字段的数量和顺序匹配。每组对应的 return_expression collection 字段的类型必须兼容。 subquery 子查询语句。

    将 dept 表中第 20 部门的位置更改为 AUSTIN:

    UPDATE dept SET loc = 'AUSTIN' WHERE deptno = 20;

    对于 emp 表中 job = SALESMAN 的所有员工,将工资提升 10% 并将佣金增加 500。

    UPDATE emp SET sal = sal * 1.1, comm = comm + 500 WHERE job = 'SALESMAN';

    select * from table1 的结果作为一个目标对象,将目标对象的列class修改为1:

    UPDATE (SELECT * FROM table1) SET class = 1 WHERE id = 1; 
  •