v_sal emptype.salary%type := 0; -- 显式初始化为 0
v_sal_sum emptype.salary%type; -- 未初始化,隐含为 NULL
v_sal 初始化為 0,迴圈累加 v_sal := v_sal + v_emp.salary 正常運作。v_sal_sum 未初始化為 NULL,SELECT SUM(salary) INTO v_sal_sum 若查無資料仍為 NULL;後續 v_sal := v_sal / v_sal_sum 任何數除以 NULL 結果為 NULL,導致函數回傳 NULL(無輸出)。Oracle 中任何與 NULL 運算(算術、比較、串接)結果皆為 NULL。 變數宣告若未顯式賦值,預設為 NULL。
v_sal_sum emptype.salary%type := 0;v_sal := v_sal / NVL(v_sal_sum, 1); 避免除以零或 NULL。c_emp%ROWCOUNT 或 c_emp%NOTFOUND 確認有資料再計算。「依賴隱性轉換或預設值」是資料庫程式設計大忌。所有變數在使用前必須顯式初始化,是編寫可靠 PL/SQL 的鐵律。