UPDATE

UPDATE文は、表のすべての行または検索条件を満たす行の1つ以上の列値を更新します。

必要な権限

表の所有者に必要な権限はありません。

別のユーザーの表の場合、UPDATEが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutでサポートされています。

SQL構文

UPDATE [hint] [FIRST NumRows] 
{[Owner.]TableName [CorrelationName]}
SET {ColumnName =
{Expression1 | NULL | DEFAULT}} [,...]
[ WHERE SearchCondition ]
RETURNING|RETURN Expression2[,...] INTO DataItem[,...]

パラメータ

パラメータ 説明

hint

UPDATE 文に文レベルのオプティマイザ・ヒントを指定します。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

FIRST NumRows

更新する行の数を指定します。FIRST NumRowsは、副問合せの文ではサポートされていません。NumRowsには、正のINTEGER値か動的パラメータのプレースホルダを指定する必要があります。動的パラメータのプレースホルダの構文は、?または:DynamicParameterです。動的パラメータの値は、文の実行時に設定されます。

[Owner.]TableName [CorrelationName]

[Owner.]TableNameは、更新される表を示します。

CorrelationNameは表の別名を指定します。また、基本名の構文ルールを満たしている必要があります。詳細は、「基本名」を参照してください。UPDATE文の他の場所でその表の列にアクセスする際、実際の表名ではなく相関名を使用します。相関名の有効範囲は、それが使用されているSQL文です。

単一の文のすべての相関名は、一意である必要があります。

SET ColumnName

ColumnNameとは、更新する列を指定します。単一のUPDATE文で同じ表の複数の列を更新できます。主キー列の値が変更されないかぎり、更新する列のリストに主キー列を含めることができます。

Expression1

集計関数を含まない式。式は、更新操作に指定した行ごとに評価されます。式のデータ型は、更新する列のデータ型と互換性がある必要があります。値を更新する場合、Expression1には列や順序CURRVALまたはNEXTVAL参照を指定できます。詳細は、「TimesTen ClassicでのCURRVALおよびNEXTVALの使用方法」を参照してください。

NULL

WHERE句を満たす各行の指定した列にNULL値を挿入します。NULL値可能な列である必要があります。

DEFAULT

列をデフォルト値で更新する必要があることを指定します。

WHERE SearchCondition

検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、SET句の指定に従って更新されます。検索条件に一致しない行に影響はありません。検索条件に一致する行がない場合、表は変更されません。

Expression2

有効な式の構文。詳細は、「式」を参照してください。

DataItem

取得したExpression2値を格納するホスト変数またはPL/SQL変数。

説明

  • TimesTen Scaleoutでは、分散キー列は、列を同じ値に更新する以外の更新はできません。

  • 主キー列は、列を元の値に更新する以外の更新はできません。

  • WHERE句を省略した場合、表のすべての行はSET句の指定に従って更新されます。

  • UPDATE操作中に文字またはバイナリ文字列が切り捨てられた場合、TimesTenによって警告が生成されます。

  • 制約違反(UNIQUEFOREIGN KEYNOT NULL)が発生すると、UPDATE文は失敗します。

  • 外部キー制約に違反するUPDATE操作はエラーになります。外部キー制約の詳細は、「CREATE TABLE」を参照してください。

  • RETURNING句の制限:

    • Expression2は単純な式である必要があります。集計関数はサポートされません。

    • 順序番号はOUTパラメータに戻せません。

    • ROWNUMおよび副問合せは、RETURNING句では使用できません。

    • RETURNING句に使用されているパラメータは、UPDATE文で重複して使用できません。

    • RETURNING句を使用して複数行を戻すには、PL/SQL BULK COLLECT機能が必要です。『Oracle TimesTen In-Memory Database PL/SQL開発者ガイド』「FORALL操作およびBULK COLLECT操作」を参照してください。

    • PL/SQLでは、RETURNING句はWHERE CURRENT処理と一緒には使用できません。

UPDATE文を使用してdepartment_id = 110のemployeesを更新します。department_id = 110のemployeesの場合は、manager_idjob_id = 'FI_ACCOUNT'のemployeesmanager_idに更新します。SET句の副問合せでDISTINCT修飾子を使用します。

job_id = 'FI_ACCOUNT'のemployeesmanager_idを検索します。

Command> SELECT manager_id FROM employees WHERE job_id = 'FI_ACCOUNT';
< 108 >
< 108 >
< 108 >
< 108 >
< 108 >
5 rows found.

次に、department_id = 110のemployeesmanager_idを検索します。

Command> SELECT manager_id FROM employees WHERE department_id = 110;
< 101 >
< 205 >
2 rows found.

ここで、department_id = 110のemployeesmanager_idを更新します。SET副問合せでSELECT DISTINCTを使用します。UPDATEの後に、department_id = 110のemployeesmanager_idが更新されたことを確認します。

Command> UPDATE employees SET manager_id =
          (SELECT DISTINCT employees.manager_id
           FROM employees
           WHERE employees.job_id = 'FI_ACCOUNT')
         WHERE employees.department_id = 110;
2 rows updated.

Command> SELECT manager_id FROM employees WHERE department_id = 110;
< 108 >
< 108 >
2 rows found.

UPDATE文のSET句で副問合せを使用します。location_id = 1700またはlocation_id = 2400のemployeesを更新します。これらの従業員のdepartment_idlocation_id = 2500のdepartment_idに設定します。(これはdepartment_id 80です)。これらの従業員の給与を所属する部門の最大給与に設定します。

最初の5人の従業員に対して問合せを実行してdepartment_idと給与を確認します。

Command> SELECT FIRST 5 employee_id, department_id, salary
         FROM employees
         ORDER BY employee_id, department_id, salary;
< 100, 90, 24000 >
< 101, 90, 17000 >
< 102, 90, 17000 >
< 103, 60, 9000 >
< 104, 60, 6000 >
5 rows found.

ここでUPDATE文を使用して従業員を更新します。

Command> UPDATE employees e1
         SET department_id =
              (SELECT department_id FROM departments
               WHERE location_id = 2500),
             salary =
              (SELECT MAX(salary) FROM employees e2
                WHERE e1.department_id = e2.department_id)
         WHERE department_id IN
           (SELECT department_id FROM departments
            WHERE location_id = 2400 OR location_id = 1700);
19 rows updated.

最初の5人の従業員を再度問合せて、元のdepartment_idが90の従業員が更新されていることを確認します。department_idは80になり、給与は24000になっています。

Command> SELECT FIRST 5 employee_id, department_id, salary
         FROM employees
         ORDER BY employee_id, department_id, salary;
< 100, 80, 24000 >
< 101, 80, 24000 >
< 102, 80, 24000 >
< 103, 60, 9000 >
< 104, 60, 6000 >
5 rows found.

次の例は、コストが$500を超える部品の価格を25%引き上げます。

UPDATE purchasing.parts
SET salesprice = salesprice * 1.25
WHERE salesprice > 500.00;

次の例は、順序seqNEXTVAL値を使用して列を更新します。

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 SET orders.status = 'shipped'
    WHERE EXISTS (SELECT 1 FROM orders b
        WHERE a.id = b.id AND a.rowid < b.rowid);

次の例は、employees表内の'Jones'という姓の従業員について、job_idsalaryおよびdepartment_idを更新します。salarylast_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]

パラメータ

結合更新文には、次のパラメータがあります。

パラメータ 説明

[Owner.]TableName

更新する表を指定します。

SET (ColumnName[,...])= Subquery

更新する列を指定します。単一のUPDATE文で同じ表の複数の列を更新できます。SET句に含めることができる副問合せは1つのみですが、この副問合せはネストできます。

副問合せの選択リストの値の数は、SET句で指定された列数と同じである必要があります。副問合せが更新する行に対して2行以上返す場合は、エラーが返されます。

WHERE SearchCondition

検索条件には副問合せを含めることができます。検索条件がTRUEとなる行はすべて、SET句の指定に従って更新されます。検索条件に一致しない行に影響はありません。検索条件に一致する行がない場合、表は変更されません。

説明

結合更新のSET句内で副問合せを使用しても、更新されるターゲット表の行数は削減されません。削減は、WHERE句を使用して指定する必要があります。したがって、WHERE句内でターゲット表の行が指定されているにもかかわらず、副問合せがこの行に対していずれの行も返さない場合、この行の更新対象列はNULL値に更新されます。

この例では、t1の行がt2と一致しない場合、最初のSELECTx1の値と2番目のSELECTx1および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の行のみを更新するようにUPDATE文を制限するには、副問合せを含む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);

関連項目

SELECT