SQLでFOR UPDATEを使って更新する例

セレクト結果の1レコードずつ更新したい場合の例。 以下を参照して作成。

SQL を繰り返し実行する

【ORACLE】日付の加算減算、時刻の加算減算

SET SERVEROUTPUT ON

DECLARE
  cursor CUR is SELECT ID,NAME,UPDATE_TIME
                  FROM テーブル名
                 WHERE '1000' <= ID AND ID <= '1999'
                   FOR UPDATE;
  vIndex NUMBER(10);
  vSingle VARCHAR(10);
  vMulti VARCHAR(30);
  vName テーブル名.NAME%TYPE;
  vRec CUR%ROWTYPE;
BEGIN
  vIndex := 1;
  OPEN CUR;
  LOOP
    FETCH CUR INTO vRec;
    EXIT WHEN CUR%NOTFOUND;
    
    vSingle := TO_CHAR(vIndex, 'FM0000');
    vMulti := TO_MULTI_BYTE(vSingle);
    vName := vRec.NAME || vMulti;
    SYS.DBMS_OUTPUT.PUT_LINE('ID=' || vRec.ID
        || ' 氏名=' || vRec.NAME
        || ' 更新時刻=' || TO_CHAR(vRec.UPDATE_TIME, 'YYYY-MM-DD HH24:MI:SS')
        || ' 更新時刻-30日=' || TO_CHAR(vRec.UPDATE_TIME-30, 'YYYY-MM-DD HH24:MI:SS')
        || ' SINGLE=' || vSingle
        || ' MULTI=' || vMulti);
    UPDATE テーブル名 SET NAME=vName WHERE CURRENT OF CUR;
    
    vIndex := vIndex + 1;
  END LOOP;

  COMMIT;
END;
/