更新表的行。

語法

UPDATE [ optimizer_hint ] table[subquery][@dblink ]
    SET column = { expression | DEFAULT } [, ...]
  [ WHERE condition ]
  [ RETURNING return_expression [, ...]
      { INTO { record | variable [, ...] }
      | BULK COLLECT INTO collection [, ...] } ]

說明

UPDATE 更改滿足條件的所有行中指定列的值。只需在 SET 子句中提及要修改的列;未顯式修改的列保留其先前的值。

只能在 SPL 程序中指定 RETURNING INTO { record | variable [, ...] } 子句。此外,UPDATE 命令的結果集不能返回多個行,否則將引發異常。如果結果集為空,則將目標記錄或變量的內容設置為 null。

只有在 SPL 程序中使用 UPDATE 命令時,才能指定 RETURNING BULK COLLECT INTO collection [, ...] 子句。如果將多個 collection 指定為 BULK COLLECT INTO 子句的目標,則每個 collection 必須包含一個標量字段,即 collection 不得為記錄。UPDATE 命令的結果集可以包含零個、一個或多個行。針對結果集的每一行,return_expression 的求值結果成為 collection 中的元素,從第一個元素開始。會刪除 collection 中的所有現有行。如果結果集為空,則 collection 也將為空。

必須對表具有 UPDATE 特權才能更新表,還必須對在 expressioncondition 中讀取其值的任何表具有 SELECT 特權。

參數

參數 說明
optimizer_hint 向優化程序提供的注釋嵌入式提示,用于選擇執行計劃。
table 要更新的表的名稱(可能是 schema 限定的)。
dblink 用于標識遠程數據庫的 database link 名稱。有關 database link 的信息,請參見 CREATE DATABASE LINK 命令。
column 表中的列名。
expression 要分配給列的表達式。表達式可以使用表中此列和其他列的舊值。
DEFAULT 將列設置為其默認值(如果沒有為其分配特定的默認表達式,則為 null)。
condition 返回 BOOLEAN 類型的值的表達式。將僅更新此表達式返回 true 的行。
return_expression 可能包括表中一列或多列的表達式。如果在 return_expression 中指定表中的列名,則按如下方式確定在對 return_expression 求值時替換該列的值:
  • 如果在 UPDATE 命令中為 return_expression 中指定的列分配一個值,則在計算 return_expression 時使用指定的值。
  • 如果未在 UPDATE 命令中為 return_expression 中指定的列分配值,則受影響的行中列的當前值將用于計算 return_expression
record 要為其字段分配 return_expression 求值結果的記錄。第一個 return_expression 分配給 record 中的第一個字段,第二個 return_expression 分配給 record 中的第二個字段,以此類推。record 中的字段數量必須與表達式數量準確匹配,而且字段類型必須與為其分配的表達式類型兼容。
variable 要為其分配 return_expression 求值結果的變量。如果指定多個return_expressionvariable,則第一個 return_expression 分配給第一個 variable,第二個 return_expression 分配給第二個 variable,以此類推。在 INTO 關鍵字之后指定的變量數量必須與在 RETURNING 關鍵字之后的表達式數量準確匹配,而且變量類型必須與為其分配的表達式類型兼容。
collection 根據 return_expression 求值結果在其中創建元素的集合。可能存在單個集合(該集合可能是由單個字段組成的集合,也可能是由記錄類型組成的集合),也可能存在多個集合(在這種情況下,每個集合必須由單個字段組成)。返回表達式的數量和順序必須與所有指定集合中字段的數量和順序匹配。每組對應的 return_expressioncollection 字段的類型必須兼容。
subquery 子查詢語句。

示例

將 dept 表中第 20 部門的位置更改為 AUSTIN:

UPDATE dept SET loc = 'AUSTIN' WHERE deptno = 20;

對于 emp 表中job = SALESMAN 的所有員工,將工資提升 10% 并將傭金增加 500。

UPDATE emp SET sal = sal * 1.1, comm = comm + 500 WHERE job = 'SALESMAN';

select * from table1的結果作為一個目標對象,將目標對象的列class修改為1:

UPDATE (SELECT * FROM table1) SET class = 1 WHERE id = 1;