發生情境:UNION、MINUS、INTERSECT 集合運算時,上下查詢欄位數量或型別不符。
解決:調整兩側 SELECT 清單欄位數量、順序、資料型別一致。
發生情境:.NET 使用 System.Data.OracleClient 存取 Oracle,資料庫欄位精度超過 .NET 資料型別範圍(如 NUMBER(38) 超過 Decimal.MaxValue)。
解決:在 SQL 中使用 TRUNC(number, decimals) 截取精度至 .NET 可接受範圍,或調整資料庫欄位定義。
SELECT TRUNC(high_precision_col, 10) FROM ...
現象:新安裝 Oracle Client 後應用程式啟動失敗,提示找不到 OCI.DLL。
排查步驟:
OCI.DLL 存在於 %ORACLE_HOME%\BIN。PATH 最前端。regsvr32 oci.dll(通常不需註冊)。原因:長時間執行查詢時,Undo 區段已被覆寫,無法建構一致性讀取影像。
解決方向:
UNDO_RETENTION 參數。RETENTION GUARANTEE 保護 Undo 不被覆寫(可能導致 DML 失敗)。發生情境:呼叫預存程序回傳 REF CURSOR,但程序內未正確 OPEN 游標,或程序執行錯誤導致游標未開啟即返回。
檢查重點:
-- 正確模式
CREATE OR REPLACE PROCEDURE get_data(p_cur OUT SYS_REFCURSOR) AS
BEGIN
OPEN p_cur FOR SELECT * FROM temp_tab; -- 必須 OPEN
EXCEPTION
WHEN OTHERS THEN
-- 記錄錯誤,避免游標未開即返回
RAISE;
END;
OPEN 輸出游標。ResultSet 是否為 null 再讀取。-- 查詢錯誤訊息詳細說明
SELECT * FROM v$error_messages WHERE error_number = 1555;
-- 監控 Undo 使用情況
SELECT * FROM v$undostat;