Remove the EXCEPTION handlers and you will find out what the error actually is. You should not explicitly handle unexpected exceptions.
It would also be better to use bind variables e.g. change this:
|| 'substr(ta_xxxx_id,1,7) = ''sssssss'' '
|| 'and substr(ta_xxxx_id,instr(ta_xxxx_id,''*'',1,2)+1) = ''aaaa'' '
to
|| 'substr(ta_xxxx_id,1,7) = :sssssss '
|| 'and substr(ta_xxxx_id,instr(ta_xxxx_id,''*'',1,2)+1) = :aaaa '
then add a USING clause to the OPEN statement:
OPEN CUR_faawards FOR thequery USING id, v_year;
and remove the REPLACE code for these. I'm afraid you are stuck with 'xxxx' due to the awful table design - a column for each year?!?!