操作带lob字段表,报ORA-1555、ORA-22924、ORA-1578、ORA-22922问题处理
报这些错,例如1555并不是因为回滚段空间不够,原因在于LOB段的损坏,解决如下:
1 标识出哪一行的lob有坏
a、建个临时表
SQL> create table corrupt_lobs (corrupt_rowid rowid, err_num number);
b、对表进行逐行检测
DECLARE ERROR_1578 EXCEPTION; ERROR_1555 EXCEPTION; ERROR_22922 EXCEPTION; PRAGMA EXCEPTION_INIT(ERROR_1578, -1578); PRAGMA EXCEPTION_INIT(ERROR_1555, -1555); PRAGMA EXCEPTION_INIT(ERROR_22922, -22922); N NUMBER; BEGIN FOR CURSOR_LOB IN (SELECT ROWID R,C_LOB FROM QIUYB.TEST_LOB partition (SYS_P333559)) LOOP BEGIN N := DBMS_LOB.INSTR(CURSOR_LOB.C_LOB, HEXTORAW('889911')); EXCEPTION WHEN ERROR_1578 THEN INSERT INTO corrupt_lobs VALUES (CURSOR_LOB.R, 1578); COMMIT; WHEN ERROR_1555 THEN INSERT INTO corrupt_lobs VALUES (CURSOR_LOB.R, 1555); COMMIT; WHEN ERROR_22922 THEN INSERT INTO corrupt_lobs VALUES (CURSOR_LOB.R, 22922); COMMIT; END; END LOOP; END;
2 对坏的lob置空
UPDATE QIUYB.TEST_LOB set C_LOB = empty_clob() where rowid in (select corrupt_rowid from corrupt_lobs);
3 参考文档
ORA-1578 ORA-26040 in a LOB segment – Script to solve the errors (Doc ID 293515.1)
近期评论