2

以下のPL/SQLコードでは、TABLE_ONEはテーブル名tname、列名cname、およびrowidridを保持します。Forループは、TABLE_ONEからレコードをフェッチし、行IDがridのレコードのテーブルtnameの列cnameを更新します。ただし、tnameで更新されるレコードがロックされている場合、forループがスタックし、TABLE_ONEからのそれ以上のレコードは処理されません。理想的には、更新が失敗したレコードを無視してさらに先に進むスクリプト。何が問題なのか教えてください。

BEGIN
    FOR c IN (SELECT * FROM TABLE_ONE a )
    LOOP
        DECLARE
            TNAME varchar2(30);
            CNAME varchar2(30);
            RID ROWID;
            X number;
            updt_stmt varchar2(300);
        BEGIN
          BEGIN
            TNAME := c.TNAME;
            CNAME := c.CNAME;
            RID   := c.RID;                
            DBMS_OUTPUT.PUT_LINE( TNAME || '=>' || CNAME);
            updt_stmt := 'UPDATE ' || TNAME || ' SET ' || CNAME || ' = ''123'' WHERE  ROWID   like ''%' || RID || '%''';                
            EXECUTE IMMEDIATE updt_stmt;

          EXCEPTION
            WHEN OTHERS THEN
            DBMS_OUTPUT.PUT_LINE('ERROR');

          END;
        END;
    END LOOP;
END;
4

1 に答える 1