Поскольку ваши имена переменных совпадают с именами столбцов, возможно, что анализатор видит их как имена столбцов, а не как переменные, и, следовательно, вы получаете все строки, в которых столбцы равны друг другу, что будет исключать только строки со значениями NULL.
Я бы предложил всегда использовать разные имена для ваших переменных, чем для столбцов, чтобы избежать путаницы. Общепринятым методом является использование некоторого префикса в имени переменной, например l_
для локальной переменной, p_
для параметров или g_
для глобальных переменных.
В этом случае может быть лучше параметризовать курсор:
CURSOR code_cur (p_role_code INTEGER, p_service_code INTEGER) IS
select er.elig_code
from idm_elig_rule er
where ER.ROLE_CODE = p_role_code and ER.SERVICE_CODE = p_service_code;
Тогда вы будете передавать значения при открытии курсора, например ::
FOR code_rec IN code_cur ( my_role_code_value, my_service_code_value ) LOOP