Я бы, вероятно, написал что-то вроде этого (где два цикла могут вызывать одинаковые функции)
BEGIN
IF( v_action = 'DO THIS' )
THEN
FOR this_cur IN (SELECT * FROM <THIS>)
LOOP
<<do something>>
END LOOP;
ELSE
FOR that_cur IN (SELECT * FROM <THAT>)
LOOP
<<do something else>>
END LOOP;
END IF;
END;
Вы также можете использовать динамический SQL для открытия курсора, но это может стать более сложным, особенно еслиЕсть только два варианта.
IS
get_records SYS_REFCURSOR;
l_sql_stmt VARCHAR2(100);
BEGIN
IF( v_action = 'DO THIS' )
THEN
l_sql_stmt := 'SELECT * from <THIS>';
ELSE
l_sql_stmt := 'SELECT * from <THAT>';
END IF;
OPEN get_records FOR l_sql_stmt;
...