SELECT ... FOR UPDATE 粘貼幾百行數據執行時報錯:ORA-01438: value larger than specified precision allowed for this column,不知哪行哪列超標。
ALTER TABLE your_table MODIFY (problem_col NUMBER(38,10)); -- 先擴大
-- 執行 UPDATE
-- 成功後再縮回原精度(若業務允許)
適合一次性修復上線腳本,開發環境首選。
DECLARE
CURSOR c_data IS SELECT rowid, col1, col2, ... FROM your_table WHERE ...;
v_err_msg VARCHAR2(4000);
BEGIN
FOR rec IN c_data LOOP
BEGIN
UPDATE your_table SET col1 = rec.col1, col2 = rec.col2 ... WHERE rowid = rec.rowid;
EXCEPTION
WHEN OTHERS THEN
v_err_msg := SQLERRM;
DBMS_OUTPUT.PUT_LINE('Rowid: ' || rec.rowid || ' Error: ' || v_err_msg);
-- 可選:記錄到日誌表
END;
END LOOP;
END;
/
輸出會精確顯示哪個 ROWID 導致超精度。
將幾百行數據導出為 CSV,用 Python/PowerShell 掃描:
import re, csv
with open('data.csv') as f:
reader = csv.DictReader(f)
for i, row in enumerate(reader):
for col, val in row.items():
if re.match(r'^\d{15,}$', val): # 整數位超 14 位
print(f'Row {i} Col {col} value {val} may overflow NUMBER(14,2)')
NUMBER(18,4) 而非 NUMBER(10,2))。DBMS_SQL 動態綁定變量,由驅動程序自動檢查類型溢出。