特定のテーブルのすべての列を更新しようとしています。 このテーブルには〜200,000,000レコードがあります。ROWIDのみを含むカーソルをループするpl/sqlを実行しようとしたときにエラーが発生しました
単純な更新ステートメントを実行しようとすると機能しません。私はそれを実行しようとする
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
すべての行が更新される前に 'SOME_KEY'がNULLになっていますか?そうであれば、簡単な 'UPDATE ... WHERE some_key IS NULLとROWNUM <= 50000'でこれを行うことができます。これをループに入れ、SQL%ROWCOUNTがゼロのときにループを終了します。 –
それはあまりにも遅いです。私はすでにそれを試みました。それは4倍(3.7時間)を要した。 – ScrappyDev
私のコメントは、パフォーマンスを犠牲にすることを意味する「メモリ不足」の問題を克服するためのものです。しかし、あなたの状況に適しているかもしれないし、そうでないかもしれない 'some_key'の適切な機能インデックスを使ってパフォーマンスの問題を克服することも可能です。 –