條款四十八,不要遍巡 CURSOR 去確認是否含有資料。

像是下面這段程式片巡走訪 CURSOR 以確認是否含有資料,這樣並不是很好的寫法。

DECLARE 
  l_employee_found BOOLEAN := FALSE; 
  … 
BEGIN 
  <<check_employees>> 
  FOR r_employee IN c_employee 
  LOOP 
    l_employee_found := TRUE; 
  END LOOP check_employees; 
END;

比較好的作法應該像是下面這段程式這樣,將 CURSOR 開啟,嘗試 Fetch 一筆資料,利用 CURSOR 的 %FOUND 去判斷是否含有資料,最後將 CURSOR 關閉。

DECLARE
l_employee_found BOOLEAN := FALSE;
…
BEGIN
OPEN c_employee;
FETCH c_employee INTO r_employee;
l_employee_found := c_employee%FOUND;
CLOSE c_emplyoee;
END;