Skip to content

UPDATE

修改表中现有的的数据。

主要语法结构

语法格式

更新指定表中的数据。

sql
UPDATE base_table_refs SET update_target_list [ opt_from_clause ] [ opt_where_clause ] [ opt_returning ] [ opt_bulk ] [ opt_into_list ]

更新当前游标指向的数据。

sql
UPDATE base_table_refs SET update_target_list [ opt_from_clause ] WHERE CURRENT OF name [ opt_returning ] [opt_bulk ] [ opt_into_list ]

通过子查询来设置更新的目标值。

sql
UPDATE base_table_refs SET ( update_target_list ) = select_with_parens [ opt_where_clause ] [ opt_returning ] [ opt_bulk ] [ opt_into_list ]

参数说明

  • base_table_refs:更新的表或视图名,前面也可加上相应的模式名。
  • update_target_list:更新的目标,可以是多个用逗号分隔的部分。
  • select_with_parens:查询语句。
  • opt_from_clause:可选的 from 从句,用于从另一个或多个表中查询结果作为目标表列的更新值。
  • opt_where_clause:可选的 where 从句,用于对从表中查询出的数据做过滤或限制。
  • WHERE CURRENT OF name:通常用于游标更新时的定位条件,其中 name 为游标变量的名字。
  • opt_returningopt_into_list:可选的关键词,用于把更新后的结果输出至指定的变量或数据结构。
  • opt_bulk:可选关键词,用于修饰 opt_returning opt_into_list 关键词,指定该关键词后把结果一次性输出,而不是每次仅输出一行数据。

目标表引用base_table_refs

语法格式

sql
base_table_refs::=
    base_table_ref [,base_table_ref]...
    
base_table_ref::=
    relation_expr
|   relation_expr alias_clause

relation_expr::=
    name_space [PARTITION (name_list) | SUBPARTITION (name_list)]

alias_clause::=
    AS ColId (name_list)
|   AS ColId
|   ColId (name_list)
|   ColId

参数说明

  • name_space [PARTITION (name_list) | SUBPARTITION (name_list)]name_space 是表名或视图名,而 [PARTITION (name_list) | SUBPARTITION (name_list)] 部分用于指定要更新的表的分区或子分区。
  • AS ColId (name_list):为表指定别名,并为该表中的列指定新的名称。
  • AS ColId:仅指定表的别名。
  • ColId (name_list):为表指定别名,并为该表中的列指定新的名称,但没有 AS 关键字。
  • ColId:仅指定表的别名,没有 AS 关键字。

更新目标列表update_target_list

语法格式

sql
update_target_list::=
    [ table_alias ] column_name = expr
    [, [ table_alias ] column_name = expr ]...

expr::=
    b_expr
    | bool_expr1
    | '(' rop_bool_expr ')'
    | DEFAULT

参数说明

  • table_alias:表名或表的别名,该部分为可选项。
  • column_name:列名。
  • expr:是目标要更新成的值的表达式,具体又可分为:固定值(NULL或非NULL的常值)、关键字DEFAULT、运算表达式、子查询(查询结果不能大于1行)。

关于b_expr等表达式的说明,可参照查询语法中的target_list小节。

示例

  • 示例1
    更新结果为常值。

    sql
    UPDATE t2 SET c2 = 'new_a_1', c3 = DEFAULT WHERE c1 = 5;
  • 示例2
    更新结果为子查询。

    sql
    UPDATE t2 SET (c2, c3) = (SELECT MAX(c2), MIN(c3)+10 FROM t1) WHERE c1 = 6;
  • 示例3
    更新时将结果 RETURNING。

    sql
    DECLARE
      TYPE type_table_1 IS TABLE OF T1%ROWTYPE;    -- UDT类型:T1 行类型的嵌套表
      var_t1 TYPE_TABLE_1;                         -- UDT类型变量,用来保存游标中查询的数据
      TYPE type_table_int IS TABLE OF t2.c2%TYPE;  -- UDT类型:INT 类型的嵌套表
      var_int TYPE_TABLE_INT;                      -- UDT类型变量,用来保存 RETURNING 的值
      CURSOR cur IS SELECT * FROM t1;
    BEGIN
      OPEN cur;
      FETCH cur BULK COLLECT INTO var_t1;
      UPDATE t2
        SET c2 = var_t1(1).c2,
            c3 = c3 + 100
        RETURNING c1 BULK COLLECT INTO var_int;
      CLOSE cur;
      -- 如果需要,可把 RETUNING 的数据输出至屏幕或表中
      FOR i IN 1..var_int.COUNT() LOOP
        SEND_MSG(var_int(i));
      END LOOP;
    END;