Oracle 尝试执行pl/sql时出错,该pl/sql在仅包含ROWID';s
我正在尝试更新给定表中的所有列。 此表中有约200000000条记录 尝试运行简单的update语句无效 这是我的密码:Oracle 尝试执行pl/sql时出错,该pl/sql在仅包含ROWID';s,oracle,plsql,oracle11g,rowid,Oracle,Plsql,Oracle11g,Rowid,我正在尝试更新给定表中的所有列。 此表中有约200000000条记录 尝试运行简单的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; LOO
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
您的
光标
定义不正确。你想要什么
CURSOR c_rowIdCursor
IS SELECT ROWID
FROM SOME_TABLE;
当然,我不知道为什么简单的更新不起作用。它将更高效,使用更少的资源,需要更少的代码。它因共享池内存而中断。
无法按X扩展段。
错误。@scraskythenell-确切的错误是什么?通常,如果您试图将更新拆分为多个部分,您也会遇到相同的错误--听起来您的一个表空间的空间不足。我认为是undo表空间太小了。分解它是有效的。在更新所有行之前,SOME_KEY
NULL是否为所有行?如果是这样的话,您可以通过一个简单的更新来实现这一点……其中某个_键为NULL,而ROWNUM则太慢了。我已经试过了。这花费了4倍的时间(3.7小时)。我的评论旨在帮助您克服“内存不足”问题,这意味着牺牲性能。尽管如此,在某些键上使用合适的函数索引来克服性能问题可能是可行的,这可能适合您的情况,也可能不适合您的情况。我们已将撤消表空间扩展到60GB,但插入仍然不起作用。然而,删除返回ROWID起了作用。