條款二十九,Try to use anchored records as targets for your cursors。

像是下面這邊的程式就宣告了幾個變數,開啟 Cursor 後遍巡,將資料塞到變數後再進一步處理。

DECLARE
CURSOR c_user IS
SELECT user_id, firstname, lastname
FROM user;
l_user_id user.user_id%TYPE;
l_firstname user.firstname%TYPE;
l_lastname user.lastname%TYPE;
BEGIN
OPEN c_user;
FETCH c_user INTO l_user_id, l_firstname, l_lastname;
WHILE c_user%FOUND
LOOP
FETCH c_user INTO l_user_id, l_firstname, l_lastname;
END LOOP;
CLOSE c_user;
END;

如果改用 cursor-anchored records 去實作,就可以省去一些不必要的變數宣告。

DECLARE 
    CURSOR c_user IS 
        SELECT user_id, firstname, lastname 
        FROM user; 
    r_user c_user%ROWTYPE; 
BEGIN 
    OPEN c_user; 
    FETCH c_user INTO r_user; 
    <<process_user>> 
    WHILE c_user%FOUND 
    LOOP 
        FETCH c_user INTO r_user; 
    END LOOP process_user; 
    CLOSE c_user; 
END;