UPDATE

说明

更新一个基本表或视图中的一行或多行

语法

update_stmt ::=

set_singlecol ::=

set_manycol ::=

from_stmt ::=

returning_clause ::=

参数

schema_name

待更新对象(表或视图)所属模式名

table

待更新的基本表

view

待更新的视图

partition_extension_clause

水平分区表的子表信息。详细含义参见 SELECT 中的 partition_extension_clause

column

表或视图中的字段名。

expr

一个表达式,用于赋予被更新字段的新值。

table_reference

神通数据库对标准的SQL92进行了扩展,允许 UPDATE 语句中带有 FROM 子句,详细含义参见下文的``FROM 子句``。

condition

被更新的元组需要满足的条件。请参见 SELECT: WHERE 子句的说明。

single_row_expression

返回表中一行数据的表达式。

variable_name

存储所选列值的变量。

注解

  • UPDATE语句更新指定的表或视图中满足条件的行,只更新那些在SET子句中出现的字段,保持其它的字段不变。
  • 并不是所有视图都是可更新的。
  • 为了执行UPDATE语句,用户必须拥有待更新的表上的UPDATE权限,或每个待更新的字段上的UPDATE权限。 另外,在多用户状态下,系统表是不能通过UPDATE语句进行更新的,但在单用户状态下,系统管理员可以通过 UPDATE 语句更新系统表。
  • 支持在DELETE语句中使用DBLINK远端表。

from_stmt

一个非标准的扩展,允许别的表中的列/字段出现在 WHERE 条件里。

create table a(a int);

insert into a values(1259);

update a set a = 1 from sys_class where oid = a;

returning_clause

RETURNING 子句中 single_row_expression 可以有多列, 即类似 RETURNING column1, column2 INTO var1, var2 形式。

注意:

  • 暂不支持返回多行结果的表达式,不支持使用聚集函数的表达式。
  • INSERT 、 DELETE 、 UPDATE 语句中支持 RETURNING 功能, MERGE 、 EXECUTE IMMEDIATE 语句不支持此功能。

single_row_expression

支持大对象(BLOB、CLOB)及普通数据类型。 若为大对象类型则将 loblocator (而非数据本身)返回给 INTO 后相应变量。

variable_name

存储列值的变量。可以是 PL/SQL 语句中的变量(如 i ),也可以是绑定参数的变量(如 :var1 ), RETURNING 获取的变量值为执行 UPDATE 操作后的值。

subquery

子查询

示例

示例1: 更新所有元组

--  清理环境
DROP TABLE tab1 CASCADE;

--  创建表并插入数据
CREATE TABLE tab1(a INT, b INT);

INSERT INTO tab1 VALUES(1, 1);
INSERT INTO tab1 VALUES(2, 221);
INSERT INTO tab1 VALUES(3, 223);


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |1           |
------------------------
2           |221         |
------------------------
3           |223         |
总数目:3


--  更新所有元组
UPDATE tab1 SET b = 500;


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |500         |
------------------------
2           |500         |
------------------------
3           |500         |
总数目:3


--  更新多列
UPDATE tab1 SET a = 6, b = 900;


SELECT * FROM tab1 ORDER BY a;
A(int)      |B(int)      |
------------------------
6           |900         |
------------------------
6           |900         |
------------------------
6           |900         |
总数目:3


--  删除表
DROP TABLE tab1;

示例2: 更新部分元组

--  清理环境
DROP TABLE tab2 CASCADE;

--  创建表并插入数据
CREATE TABLE tab2(a INT, b INT);

INSERT INTO tab2 VALUES(1, 1);
INSERT INTO tab2 VALUES(2, 221);
INSERT INTO tab2 VALUES(3, 223);


SELECT * FROM tab2 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |1           |
------------------------
2           |221         |
------------------------
3           |223         |
总数目:3


--  更新部分元组
UPDATE tab2 SET b = 500 WHERE a = 3;


SELECT * FROM tab2 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |1           |
------------------------
2           |221         |
------------------------
3           |500         |
总数目:3


--  删除表
DROP TABLE tab2;

示例3: 更新为复杂表达式

--  清理环境
DROP TABLE tab3 CASCADE;

--  创建表并插入数据
CREATE TABLE tab3(a INT, b INT);

INSERT INTO tab3 VALUES(1, 1);
INSERT INTO tab3 VALUES(2, 221);
INSERT INTO tab3 VALUES(3, 223);


SELECT * FROM tab3 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |1           |
------------------------
2           |221         |
------------------------
3           |223         |
总数目:3


--  更新为复杂表达式
UPDATE tab3 SET b = (a + 10) * b;


SELECT * FROM tab3 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |11          |
------------------------
2           |2652        |
------------------------
3           |2899        |
总数目:3


--  更新为复杂表达式(子查询)
UPDATE tab3 SET b = (SELECT SUM(a) FROM tab3);


SELECT * FROM tab3 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |6           |
------------------------
2           |6           |
------------------------
3           |6           |
总数目:3


--  删除表
DROP TABLE tab3;

示例4: 使用 RETURNING INTO

--  清理环境
DROP PROCEDURE proc1;
DROP TABLE tab4 CASCADE;

--  创建表并插入数据
CREATE TABLE tab4(a INT, b INT);

INSERT INTO tab4 VALUES(1, 121);
INSERT INTO tab4 VALUES(2, 376);
INSERT INTO tab4 VALUES(3, 852);


SELECT * FROM tab4 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |121         |
------------------------
2           |376         |
------------------------
3           |852         |
总数目:3


--  PREPARE 语句使用 RETURNING INTO
PREPARE pp1 AS
UPDATE tab4 SET b = 200 WHERE a = 2
RETURNING a, b INTO ?, ?;

EXECUTE pp1('', '');


--  b 列值已更新
SELECT * FROM tab4 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |121         |
------------------------
2           |200         |
------------------------
3           |852         |
总数目:3


--  PL/SQL 使用 RETURNING INTO
CREATE OR REPLACE PROCEDURE proc1 AS
v1 INT;
BEGIN
    UPDATE tab4 set b = 500 where a = 2 return a + b into v1;
    DBMS_OUTPUT.PUT_LINE(v1);
end;

/

--  执行存储过程,打印 NOTICE 信息 —— return 变量 v1 的值
exec proc1;


--  b 列值已更新
SELECT * FROM tab4 ORDER BY a;
A(int)      |B(int)      |
------------------------
1           |121         |
------------------------
2           |500         |
------------------------
3           |852         |
总数目:3


--  删除存储过程和表
DROP PROCEDURE proc1;
DROP TABLE tab4;