If you can change the code between the BEGIN block and END into one SQL, this can help you.
, , , , , , -
set termout off
set echo off
set colsep ''
set linesize 5000
set heading off
set feedback off
set preformat off
set trimspool on
set serverout on
spool 'C:\folder\script.sql'
select text from (
select unique 1 as rn, rec.prgm_id, rec2.cmpg_id, 'spool ''C:\folder\PRG''||lpad('||rec.prgm_id||', 4, 0)||''_CMPG''||lpad('||rec2.cmpg_id||', 4, 0)||''.txt'' CREATE' as text
from tmp_table_output rec, tmp_table_output rec2
where a.prgm_id = b.prgm_id
union all
select 2, rec.prgm_id, rec2.cmpg_id, 'SELECT field FROM tmp_table_output where prgm_id = '||rec.prgm_id||' and cmpg_id = '||rec2.cmpg_id
from tmp_table_output rec, tmp_table_output rec2
where a.prgm_id = b.prgm_id
union all
select unique 3, rec.prgm_id, rec2.cmpg_id, 'spool off'
from tmp_table_output rec, tmp_table_output rec2
where a.prgm_id = b.prgm_id
)
order by prgm_id, cmpg_id, rn;
spool off;