Basic Update Statements
The Oracle UPDATE statement processes one or more rows in a table and sets one or more columns to the values you specify.

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
FROM test;

UPDATE test
SET object_name = 'OOPS';

SELECT DISTINCT object_name
FROM test;

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
FROM test

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 *
FROM test
WHERE table_name LIKE '%A%';

SELECT *
FROM test
WHERE table_name NOT LIKE '%A%';

-- this is not a good thing ...
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 work
UPDATE 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 *
FROM test
WHERE table_name LIKE '%A%';

-- does not work
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 properly
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)
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 *
FROM test
WHERE table_name NOT LIKE '%A%
';

UPDATE (
  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
SELECT * FROM employees;

UPDATE empnew
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 table_name,
TRANSLATE(tablespace_name,'AEIOU','VWXYZ') AS TABLESPACE_NAME
FROM user_tables
WHERE rownum < 11;

SELECT * FROM t1;

SELECT * FROM t2;

UPDATE t1 t1_alias
SET (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
var bnd2 VARCHAR2(30)
var bnd3 NUMBER

UPDATE employees
SET job_id ='SA_MAN', salary = salary + 1000,
department_id = 140
WHERE last_name = 'Jones'
RETURNING salary*0.25, last_name, department_id
INTO
:bnd1, :bnd2, :bnd3;

print bnd1
print bnd2
print bnd3

rollback;
conn hr/hr

variable bnd1 NUMBER

UPDATE employees
SET salary = salary * 1.1
WHERE department_id = 100
RETURNING SUM(salary) INTO :bnd1;

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
VALUES (people_typ('Morgan', 10, 100000));

INSERT INTO people_demo2
VALUES (people_typ('Morgan', 10, 150000));

UPDATE people_demo1 p
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
FROM t;

DECLARE
 trec  t%ROWTYPE;
BEGIN
  trec.table_name := 'DUAL';
  trec.tablespace_name := 'NEW_TBSP';

  UPDATE t
  SET ROW = trec
  WHERE table_name = 'DUAL';

  COMMIT;
END;
/

SELECT DISTINCT tablespace_name
FROM t;
 
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) s
SET s.promo_id = 494
WHERE amount_sold > 9000;

http://psoug.org/reference/update.html

며칠이 지난 후 그가 이 질문에 대해 잊고 있는 것이라고 생각했을 때 그는 나를 따로 불렀다. 그는 내가 질문했던 곡의 악보 첫 장을 펴 두고 있었다. 나 또한 악보의 첫 장을 펴 놓고 그가 입을 열기를 기다렸다.

잠시 후 그는 "정명훈 군, 시간이 걸리는 것이다"라고 말했다. 나는 그 말을 마음으로 받아들였고 그것을 30년 동안 간직하고 있다. 내가 한 질문에 대한 답은 음악가로서 각자가 찾아야만 한다는 것이 그가 말하고자 한 것이었다. 그리고 결국 그는 내가 해낼 것이라고 판단했기 때문에 아낌없이 격려해 준 것이다. (321p)
SBS 서울디지털포럼 사무국 엮음, 이원복 그림 '인사이트 2010 - 이야기 속의 디지털 시대' 중에서 (살림Biz)
"정명훈 군, 시간이 걸리는 것이다."
 
정명훈 서울시립교향악단 상임지휘자에게 커다란 영향을 미쳤던 위대한 지휘자 카를로 마리아 줄리니. 그가 젊은 정명훈이 한 질문에 대해 며칠 뒤에 해준 답입니다.
 
정명훈씨는 로스앤젤레스 교향악단에서 줄리니의 어시스턴트로 3년을 지냈습니다. 소심했던 그는 1년이 지나도록 감히 그에게 단 한 번도 질문을 할 수 없었지요. 그러던 어느 날 한 곡이 너무도 난해해 고민하다 마침내 질문을 했습니다.
 
"선생님, 왜 이 곡은 소리가 좋지 않을까요?"
 
줄리니는 당연히 즉시 답을 말해줄 실력이 있는 지휘자였지만, 이렇게 말했습니다.
"한번 생각해 보겠네. 그러고 나서 이에 대해서 다시 이야기를 해 보도록 하지."
 
며칠이 지난 뒤 줄리니가 정명훈을 불러 해준 말이 바로 이것이었습니다.
"정명훈 군, 시간이 걸리는 것이다."
 
그는 애송이 지휘자에게 이렇게 쉽게 말할 수도 있었습니다.
"클라리넷 소리를 더 높이고 호른은 조금 더 부드럽게 해 봐. 그럼 소리가 더 괜찮아질 거야."
 
하지만 줄리니는 그렇게 대답하는 대신 다른 방법을 택했지요. 믿음을 보여주었고, 스스로 길을 찾아가는 것이 중요함을 알려주었습니다.
 
젊은 지휘자의 쉬운 질문 하나에도 진심을 다해 고민하며 응대해준 카를로 마리아 줄리니.
조급함에, 초조함에, 빠르고 쉬운 즉답을 찾으며 힘들어하는 우리에게 그가 이렇게 말해주는 듯합니다.
 
"자신의 길을 찾게. 원래 시간이 걸리는 것이라네."

- 예병일의 경제노트에서

'Etc > Scrap' 카테고리의 다른 글

일에 전념하라  (3) 2010.07.15
상대를 이해하고 인정하는 마인드  (1) 2010.07.09
터치 어플 관련  (0) 2010.06.10
iphone 4G 연설  (0) 2010.06.08
I'm yours  (1) 2010.05.27


둘이서 웨딩 박람회 갔다가 여기저기 좀 돌아다니다가 생각난 곳이 신사동..
예전에 한번 재영과 별언니랑 갔다가 몇년만인지..
많이 변해 있었다.
골목도 여기저기 많이 생기고.. ㅋㅋ
밥을 먹으러 왔는데.. 온통 옷집 뿐이고..
좀 외각으로 나와서 눈에 보인건 일본식 카레.. ㅋㅋ


캬캬 내가 찍는거 몰랐지롱~ ㅋㅋ


이건 내꺼.. 왕새우를 토핑으로 해서.. 약간 매운맛?
여기가 매운맛 전문이라. ㅋㅋㅋ 속이 아픈 관계로 약간.. ㅋㅋㅋ
이거저거 토핑도 있고 첨에는 좀 어려움..
맛도 생각보다 괜찮고.. ㅋㅋ 가격이 좀 하긴하는데..
토핑이나.. 머 안넣으면 너무 허전하고. ㅋ


이건 남친꺼.. ㅋㅋ 고기 넣어서..
난 내꺼가 더 좋음. ㅋㅋㅋㅋ
버섯과 왕새우~ 캬캬

'Story > Diary' 카테고리의 다른 글

입맛없을 때는 밀면  (0) 2010.07.07
[Movie] 파괴된 사나이  (0) 2010.07.03
정식으로 부산 간날  (0) 2010.06.12
정동진 번개  (0) 2010.06.06
산본 견학갔다가 정동진 가다...  (0) 2010.06.06


이미 그전에 부산에 가긴 했지만 정식으로 다시 우리집에 간날...
인사 하구 나서 집 근처 송도해수욕장까지 걸어갔는데..
벌써 난 지쳐있고.. ㅋㅋ
보이지도 않던 커피숍 겨우 찾아서 앉아서 한숨 돌리는 중.. ㅋㅋ
은근 날씨도 덥고.. 해도 쨍쨍..
해수욕장이라고 하기에는 너무 작고 아담하고.. 시골 스러운. ㅋㅋㅋ
30년 살았던 나도.. 첨 가보는 곳. ㅋㅋㅋㅋ

'Story > Diary' 카테고리의 다른 글

[Movie] 파괴된 사나이  (0) 2010.07.03
신사동 카페거리  (0) 2010.06.13
정동진 번개  (0) 2010.06.06
산본 견학갔다가 정동진 가다...  (0) 2010.06.06
산본 견학기  (0) 2010.06.05

+ Recent posts