UPDATE¶
说明¶
更新一个基本表或视图中的一行或多行
参数¶
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;