Dlaczego używasz dwóch zmiennych? Możesz to zrobić krócej (nie testowałem):
CURSOR TO_ALL(hd APR.ZONE_HD_APPR%TYPE) IS
SELECT EMP.EMPLOYEE_CODE,
EMP.EMP_NAME,
APR.LEFT_DT,
APR.RESIGN_TYPE
FROM FSC_APPROVAL APR,
JOIN CHR_ALL_EMPLOYEE_BI_V EMP ON EMP.EMPLOYEE_ID = APR.EMP_ID
WHERE APR.HOD_APPR = 'Y'
AND NVL(APR.ZONE_HD_APPR, 'NULL') = NVL(hd, 'NULL')
AND EMP.EMPLOYEE_ID = APR.EMP_ID;
CUR_VAL TO_ALL%ROWTYPE;
BEGIN
OPEN TO_ALL(CASE TRIGER_BY WHEN 'HOD' THEN 'NULL' ELSE 'Y');
LOOP
FETCH TO_ALL INTO CUR_VAL;
...
EXIT WHEN TO_ALL%NOTFOUND;
END LOOP;
END;