


























| Basic Update Statements | |
Update all records |
UPDATE <table_name> SET <column_name> = <value> |
| CREATE TABLE test AS SELECT object_name, object_type FROM all_objs;
SELECT DISTINCT object_name SET object_name = 'OOPS';
SELECT DISTINCT object_name ROLLBACK; |
|
Update a specific record |
UPDATE <table_name> SET <column_name> = <value> WHERE <column_name> = <value> |
| SELECT DISTINCT object_name FROM test;UPDATE test SET object_name = 'LOAD' WHERE object_name = 'DUAL'; COMMIT;
SELECT DISTINCT object_name |
|
Update based on a single queried value |
UPDATE <table_name> SET <column_name> = ( SELECT <column_name> FROM <table_name WHERE <column_name> <condition> <value>) WHERE <column_name> <condition> <value>; |
| CREATE TABLE test AS SELECT table_name, CAST('' AS VARCHAR2(30)) AS lower_name FROM user_tables; desc test
SELECT *
SELECT * UPDATE test t SET lower_name = ( SELECT DISTINCT LOWER(table_name) FROM user_tables u WHERE u.table_name = t.table_name AND u.table_name LIKE '%A%'); -- look at the number of rows updated SELECT * FROM test;-- neither is this UPDATE test t SET lower_name = ( SELECT DISTINCT LOWER(table_name) FROM user_tables u WHERE u.table_name = t.table_name AND u.table_name NOT LIKE '%A%');SELECT * FROM test;UPDATE test t SET lower_name = ( SELECT DISTINCT LOWER(table_name) FROM user_tables u WHERE u.table_name = t.table_name AND u.table_name LIKE '%A%') WHERE t.table_name LIKE '%A%'; SELECT * FROM test; |
|
Update based on a query returning multiple values |
UPDATE <table_name> <alias> SET (<column_name>,<column_name> ) = ( SELECT (<column_name>, <column_name>) FROM <table_name> WHERE <alias.column_name> = <alias.column_name>) WHERE <column_name> <condition> <value>; |
| CREATE TABLE test AS SELECT t. table_name, t. tablespace_name, s.extent_management FROM user_tables t, user_tablespaces s WHERE t.tablespace_name = s. tablespace_name AND 1=2; desc test SELECT * FROM test; -- does not workUPDATE test SET (table_name, tablespace_name) = ( SELECT table_name, tablespace_name FROM user_tables);-- works INSERT INTO test (table_name, tablespace_name) SELECT table_name, tablespace_name FROM user_tables; COMMIT;
SELECT * UPDATE test t SET tablespace_name, extent_management = ( SELECT tablespace_name, extent_management FROM user_tables a, user_tablespaces u WHERE t.table_name = a.table_name AND a.tablespace_name = u.tablespace_name AND t.table_name LIKE '%A%');-- works but look at the number of rows updated UPDATE test t SET (tablespace_name, extent_management) = ( SELECT DISTINCT u.tablespace_name, u.extent_management FROM user_tables a, user_tablespaces u WHERE t.table_name = a.table_name AND a.tablespace_name = u.tablespace_name AND t.table_name LIKE '%A%'); ROLLBACK; -- works properlyUPDATE test t SET (tablespace_name, extent_management) = ( SELECT DISTINCT (u.tablespace_name, u.extent_management) FROM user_tables a, user_tablespaces u WHERE t.table_name = a.table_name AND a.tablespace_name = u.tablespace_name) WHERE t.table_name LIKE '%A%'; SELECT * FROM test; |
|
Update the results of a SELECT statement |
UPDATE (<SELECT Statement>) SET <column_name> = <value> WHERE <column_name> <condition> <value>; |
| SELECT * FROM test WHERE table_name LIKE '%A%';
SELECT * SELECT * FROM test WHERE table_name NOT LIKE '%A%') SET extent_management = 'Unknown' WHERE table_name NOT LIKE '%A%'; SELECT * FROM test; |
|
| Correlated Update | |
Single column |
UPDATE TABLE(<SELECT STATEMENT>) <alias> SET <column_name> = ( SELECT <column_name> FROM <table_name> <alias> WHERE <alias.table_name> = <alias.table_name>); |
| conn hr/hr
CREATE TABLE empnew AS SET salary = salary * 1.1;UPDATE employees t1 SET salary = ( SELECT salary FROM empnew t2 WHERE t1.employee_id = t2.employee_id); drop table empnew; |
|
Multi-column |
UPDATE <table_name> <alias> SET (<column_name_list>) = ( SELECT <column_name_list> FROM <table_name> <alias> WHERE <alias.table_name> <condition> <alias.table_name>); |
| CREATE TABLE t1 AS SELECT table_name, tablespace_name FROM user_tables WHERE rownum < 11;
CREATE TABLE t2 AS SELECT * FROM t1; SELECT * FROM t2; UPDATE t1 t1_aliasSET (table_name, tablespace_name) = ( SELECT table_name, tablespace_name FROM t2 t2_alias WHERE t1_alias.table_name = t2_alias.table_name); SELECT * FROM t1; |
|
| Nested Table Update | |
| See Nested Tables page | |
| Update With Returning Clause | |
Returning Clause demo |
UPDATE (<SELECT Statement>) SET .... WHERE .... RETURNING <values_list> INTO <variables_list>; |
| conn hr/hr
var bnd1 NUMBER
UPDATE employees INTO :bnd1, :bnd2, :bnd3;
print bnd1 rollback; |
|
| conn hr/hr variable bnd1 NUMBER
UPDATE employees print bnd1 rollback; |
|
| Update Object Table | |
Update a table object |
UPDATE <table_name> <alias> SET VALUE (<alias>) = ( <SELECT statement>) WHERE <column_name> <condition> <value>; |
| CREATE TYPE people_typ AS OBJECT ( last_name VARCHAR2(25), department_id NUMBER(4), salary NUMBER(8,2)); / CREATE TABLE people_demo1 OF people_typ; desc people_demo1 CREATE TABLE people_demo2 OF people_typ; desc people_demo2
INSERT INTO people_demo1
INSERT INTO people_demo2 SET VALUE(p) = ( SELECT VALUE(q) FROM people_demo2 q WHERE p.department_id = q.department_id) WHERE p.department_id = 10; SELECT * FROM people_demo1; |
|
| Record Update | |
Update based on a record Note: This construct updates every column so use with care. May cause increased redo, undo, and foreign key locking issues. |
UPDATE <table_name> SET ROW = <record_name> WHERE <column_name> <condition> <value>; |
| CREATE TABLE t AS SELECT table_name, tablespace_name FROM all_tables;
SELECT DISTINCT tablespace_name
DECLARE SET ROW = trec WHERE table_name = 'DUAL';
COMMIT;
SELECT DISTINCT tablespace_name |
|
| Update Partitioned Table | |
Update only records in a single partition |
UPDATE <table_name> PARTITION (<partition_name>) SET <column_name> = <value> WHERE <column_name> <condition> <value>; |
| conn sh/sh UPDATE sales PARTITION (sales_q1_2005) sSET s.promo_id = 494 WHERE amount_sold > 9000; |
|
ref:http://www.psoug.org/reference/update.html
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。