UPDATE文は、表のすべての行または検索条件を満たす行の1つ以上の列値を更新します。
必要な権限
表の所有者に必要な権限はありません。
別のユーザーの表の場合、UPDATEが必要です。
SQL構文
UPDATE文の構文は、次のとおりです。
UPDATE [FIRST NumRows] {[Owner.]TableName [CorrelationName]} SET {ColumnName = {Expression1 | NULL | DEFAULT}} [,...] [ WHERE SearchCondition ] RETURNING|RETURN Expression2[,...] INTO DataItem[,...]
パラメータ
UPDATE文には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
FIRST NumRows |
更新する行の数を指定します。FIRST NumRows は、副問合せの文ではサポートされていません。NumRows には、正のINTEGERか動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、? または:DynamicParameter です。動的パラメータの値は、文の実行時に設定されます。 |
[ Owner .] TableName [ CorrelationName ] |
[
Owner .] TableName には、更新する表を指定します。
単一のUPDATE文のすべての相関名は、一意である必要があります。 |
SET ColumnName |
更新する列を指定します。 単一のUPDATE文で同じ表の複数の列を更新できます。主キー列の値が変更されないかぎり、更新された列のリストに主キー列を含めることができます。 |
Expression 1 |
集計関数を含まない式。式は、更新操作に指定した行ごとに評価されます。 式のデータ型は、更新する列のデータ型と互換性がある必要があります。 値を更新する場合、Expression1 には列、または順序CURRVALやNEXTVAL参照を指定できます。 |
NULL |
WHERE句を満たす各行の指定した列にNULL値を挿入します。NULL値可能な列である必要があります。 |
DEFAULT |
列をデフォルト値で更新する必要があることを指定します。 |
WHERE SearchCondition |
検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、SET句の指定に従って更新されます。検索条件に一致しない行に影響はありません。検索条件に一致する行がない場合、表は変更されません。 |
Expression2 |
有効な式の構文。第3章「式」を参照してください。 |
DataItem |
取得したExpression2 値を格納するホスト変数またはPL/SQL変数。 |
説明
UPDATE操作中に文字またはバイナリ文字列が切り捨てられた場合、TimesTenによって警告が生成されます。
TableName
には、UPDATE文のターゲット表を指定します。
外部キー制約に違反するUPDATE操作はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。
RETURNING句の制限:
各Expression2
は単純な式である必要があります。集計関数はサポートされません。
順序番号はOUTパラメータに戻せません。
ROWNUMおよび副問合せは、RETURNING句では使用できません。
RETURNING句に使用されているパラメータは、UPDATE文で重複して使用できません。
RETURNING句を使用して複数行を戻すには、PL/SQL BULK COLLECT機能が必要です。『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』を参照してください。
PL/SQLでは、RETURNING句はWHERE CURRENT処理と一緒には使用できません。
例
この例は、コストが$500を超える部品の価格を25%引き上げます。
UPDATE purchasing.parts SET salesprice = salesprice * 1.25 WHERE salesprice > 500.00;
この例は、順序seq
のNEXTVAL値を使用して列を更新します。
UPDATE student SET studentno = seq.NEXTVAL WHERE name = 'Sally';
次の問合せは、少なくとも1つの未出荷注文を持つすべての顧客のステータスを更新します。
UPDATE customers SET customers.status = 'unshipped' WHERE customers.id = ANY (SELECT orders.custid FROM orders WHERE orders.status = 'unshipped');
id
が主キーでない場合、次の文はすべての重複する注文を更新します。
UPDATE orders a WHERE EXISTS (SELECT 1 FROM orders b WHERE a.id = b.id AND a.rowid < b.rowid);
employees
表内の'Jones'
という姓の従業員について、job_id
、salary
およびdepartment_id
を変更します。 変数に、salary
、last_name
およびdepartment_id
の値を返します。
Command> VARIABLE bnd1 NUMBER(8,2); Command> VARIABLE bnd2 VARCHAR2(25) INLINE NOT NULL; Command> VARIABLE bnd3 NUMBER(4); Command> 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; 1 row updated. Command> PRINT bnd1 bnd2 bnd3; BND1 : 950 BND2 : Jones BND3 : 140
TimesTenでは、結合更新文がサポートされています。結合更新を使用すると、副問合せの結果を使用して、表の列を1つ以上更新できます。
構文
UPDATE [Owner.]TableName SET ColumnName=Subquery [WHERE SearchCondition]
または
UPDATE [Owner.]TableName SET (ColumnName[,…])=Subquery [WHERE SearchCondition]
パラメータ
UPDATE文には、次のパラメータがあります。
パラメータ | 説明 |
---|---|
[ Owner .] TableName |
[ Owner .] TableName には、更新する表を指定します。 |
SET ( ColumnName [,...]) = Subquery |
更新する列を指定します。単一のUPDATE文で同じ表の複数の列を更新できます。この副問合せはネストできますが、SET句に含めることができる副問合せは1つのみです。
副問合せの |
WHERE SearchCondition |
検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、SET句の指定に従って更新されます。検索条件に一致しない行に影響はありません。検索条件に一致する行がない場合、表は変更されません。 |
説明
結合更新のSET句内で副問合せを使用しても、更新されるターゲット表の行数は削減されません。この行数を削減するには、WHERE句を指定する必要があります。 したがって、WHERE句内でターゲット表の行が指定されているにもかかわらず、副問合せがこの行に対していずれの行も返さない場合、この行の更新対象列はNULL値に更新されます。
例
t1
の行がt2
と一致しない場合、最初の文のx1
の値および2番目の文のx1
とy1
の値はNULLに設定されます。
UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2); UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2);
t2
と一致するt1
の行のみを更新するように更新を制限するには、副問合せを含むWHERE句を次のように指定する必要があります。
UPDATE t1 SET x1=(SELECT x2 FROM t2 WHERE id1=id2) WHERE id1 IN (SELECT id2 FROM t2); UPDATE t1 SET (x1,y1)=(SELECT x2,y2 FROM t2 WHERE id1=id2) WHERE id1 IN (SELECT id2 FROM t2);
関連項目