1

特定のテーブルのすべての列を更新しようとしています。このテーブルには ~200,000,000 のレコードが含まれています。

単純な update ステートメントを実行しようとしてもうまくいきません。

これが私のコードです:

DECLARE
    TYPE ROW_ID_TBL IS TABLE OF ROWID;
    CURSOR c_rowIdCursor RETURN ROWID IS
        SELECT ROWID FROM SOME_TABLE;

    v_RowIDs ROW_ID_TBL;
BEGIN
    OPEN c_rowIdCursor;
    LOOP
        FETCH c_rowIdCursor BULK COLLECT INTO v_RowIDs LIMIT 50000;
        EXIT WHEN v_RowIDs.COUNT = 0;

        FORALL i IN v_RowIDs.FIRST..v_RowIDs.LAST
            UPDATE SOME_TABLE
               SET SOME_KEY = MOD(NVL(REGEXP_REPLACE(ALPHA_NUMERIC_VAL, '[^0-9]+', ''), 0), 300)+1
             WHERE ROWID = v_RowIDs(i);
        COMMIT;
    END LOOP;
END;
/

実行しようとすると、次のようになります。

ORA-06550: line 3, column 33:
PLS-00320: the declaration of the type of this expression is incomplete or malformed
ORA-06550: line 3, column 5:
PL/SQL: Item ignored
4

1 に答える 1

3

あなたのCURSOR定義は正しくありません。あなたは次のようなものが欲しい

CURSOR c_rowIdCursor
    IS SELECT ROWID 
         FROM SOME_TABLE;

もちろん、単純な更新が機能しない理由はわかりません。それはより効率的であり、より少ないリソースを使用し、より少ないコードを必要とします。

于 2012-04-17T22:22:53.290 に答える