Вы можете использовать execute немедленный (я заменил ваш явный курсор на неявный для краткости):
create table reference(
columna varchar2(100),
columnb varchar2(100),
columnc varchar2(100),
columnd varchar2(100));
insert into reference(columna, columnb, columnc, columnd)
values(':x', 'lpad(:x, 5, ''_'')', 'trim(:x)', 'substr(:x, 1, 5)');
declare
a varchar2(100);
b varchar2(100);
c varchar2(100);
d varchar2(100);
l_SQL varchar2(4000);
inval varchar2(100) default ' hello world ';
begin
for cur in (select * from reference)
loop
l_SQL := 'select ' || cur.columna || ',' || cur.columnb ||',' || cur.columnc || ',' || cur.columnd || ' from dual';
dbms_output.put_line(l_SQL);
execute immediate l_SQL into a,b,c,d using inval, inval, inval, inval;
dbms_output.put_line(a);
dbms_output.put_line(b);
dbms_output.put_line(c);
dbms_output.put_line(d);
end loop;
end;
Конечно, вам придется остерегаться атак внедрения SQL, недействительный SQLзаявления и т. д.