在 C++Builder 中使用 TStoredProc 元件執行存儲過程時,若輸出參數包含 NULL 值,呼叫 ExecProc() 會拋出例外:
錯誤:indicator variable required but not supplied
資料庫驅動程式要求對可能返回 NULL 的輸出/輸入輸出參數,必須提供「指示器變數」 (Indicator Variable) 以區別「資料為 NULL」與「資料為空字串/零值」。若未綁定指示器,驅動程式無法正確處理 NULL 語意,因而報錯。
最簡單、可移植的做法是在 T-SQL / PL-SQL 中使用 ISNULL、COALESCE 或 CASE 將可能為 NULL 的欄位轉為預設值:
-- SQL Server 範例
CREATE PROCEDURE MyProc
@m1 SMALLINT,
@m2 VARCHAR(50) OUTPUT,
@m3 INT OUTPUT
AS
BEGIN
-- 假設查詢可能返回 NULL
SELECT @m2 = ISNULL(some_column, ''), @m3 = ISNULL(another_col, 0)
FROM SomeTable WHERE id = @m1;
END
若無法修改存儲過程,需在客戶端程式碼為每個輸出參數顯式綁定指示器變數 (需使用底層 API,如 ODBC SQLBindParameter 的 StrLen_or_IndPtr 參數),複雜度較高,不建議常規專案採用。