If a select statement returns no result, change the where condition
In SQL (not PL/SQL) you can do it like this:

with p as (
  select * from drscan.oem_program p 
  WHERE upper(OEM_PROGRAMID) LIKE upper('%Subvented%')
    and oem_code = 'NCI'
    and rownum=1
    and p.ISACTIVE='Y'
)
, p2 as (
    select *
  from drscan.oem_program p 
  where oem_code ='NCI'
    and p.PROGRAMCATEGORY='NEW'
    and p.ISACTIVE='Y'
    and trunc(p.STARTDATE)&lt;=trunc(sysdate)
    and trunc(p.ENDDATE)&gt;= trunc(sysdate)
    and rownum=1
)
select * from p
union all 
select * from p2 where not exists(select 1 from p)