1. 程式人生 > 其它 >Oracle 查詢 ORA-01555 錯誤,處理方式。

Oracle 查詢 ORA-01555 錯誤,處理方式。

--建立臨時表
create table corrupt_lob (ID VARCHAR2(50));
--迴圈檢索表中錯誤資料並將ID插入臨時表
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 ID, 大欄位名稱 from 表名 )--括號內按時間過濾
loop
begin n:=dbms_lob.instr(cursor_lob.大欄位名稱,hextoraw('889911'));
exception when error_1578 then insert into corrupt_lob values (cursor_lob.ID); commit;
when error_1555 then insert into corrupt_lob values (cursor_lob.ID); commit;
when error_22922 then insert into corrupt_lob values (cursor_lob.ID);
commit;
end;
end loop;
end;


SELECT *,rowid FROM corrupt_lob;

---查詢
SELECT t.id,t.yb_settlement_value,rowid FROM PM_PAY_ACCOUNT T WHERE
T.SETTLEMENT_TIME BETWEEN TO_DATE('2021-10-28 00:00:00','YYYY-MM-DD HH24:MI:SS') AND TO_DATE('2021-10-30 00:00:00','YYYY-MM-DD HH24:MI:SS')
and t.id in (select id from corrupt_lob);

---更新為空
update PM_PAY_ACCOUNT T
set t.yb_settlement_value = ''
WHERE T.SETTLEMENT_TIME BETWEEN
TO_DATE('2021-10-28 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
TO_DATE('2021-10-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
and t.id in (select id from corrupt_lob);
commit;

以上步驟,建立一個臨時表,檢索報錯的表中大欄位。若發生 01555錯誤,將其儲存到臨時表中,然後set null。這是臨時解決方案。具體的還要看Oracle 到底出了什麼問題。