Да, вы можете:
--declare variables
TYPE curref is REF CURSOR;
c1 curref;
q VARCHAR2(2000);
--save query to string variable
q:='<insert 20 line query here>';
--open cursor
OPEN c1 FOR q;
--then, work on cursor rows, one by one
Заметьте, что 'q' может быть довольно сложным, с объединенными значениями параметров (или подзапросами, которые могут быть сохранены как отдельные переменные varchar):
q:='
select distinct
fn.BASENAME as name
,h.PARENT_ID as "admin_place_id"
,h.lev as "admin_level"
FROM (
SELECT CHILD_ID, PARENT_ID, level lev
from '||schema||'.NT_ADMIN_GRAPH
START WITH CHILD_ID='||q_sub2||'
CONNECT BY CHILD_ID=PRIOR PARENT_ID
UNION ALL
SELECT null, '||q_sub2||', 0
FROM DUAL
) h
'
||q_sub||
'
ORDER BY h.lev asc
';
См. документацию Oracle для получения дополнительных примеров того, как реализовать это.