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_returning
、opt_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
更新结果为常值。sqlUPDATE t2 SET c2 = 'new_a_1', c3 = DEFAULT WHERE c1 = 5;
示例2
更新结果为子查询。sqlUPDATE t2 SET (c2, c3) = (SELECT MAX(c2), MIN(c3)+10 FROM t1) WHERE c1 = 6;
示例3
更新时将结果 RETURNING。sqlDECLARE 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;