Ошибка при попытке выполнить pl/sql, который проходит через курсор, содержащий только ROWID
Я пытаюсь обновить все столбцы в данной таблице. В этой таблице ~200000000 записей.
Попытка запустить простой оператор обновления не работает.
Вот мой код:
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
1 ответ
Решение
Ваш CURSOR
определение неверно. Вы хотите что-то вроде
CURSOR c_rowIdCursor
IS SELECT ROWID
FROM SOME_TABLE;
Конечно, я не уверен, почему простое обновление не будет работать. Это было бы более эффективно, потребовало бы меньше ресурсов и потребовало бы меньше кода.