Зависит от многих вещей.
Если вы выполняете запрос в SP и возвращаете вложенный тип таблицы, содержащий результаты, SP потребуется время для запуска и использования памяти, необходимой для хранения данных. Также потребуется отправить все эти данные клиенту за один раз, что займет некоторое время. Но если вам нужно получить доступ ко всем данным, прежде чем делать что-то еще, а требования к памяти не слишком велики, это разумный способ сделать что-то.
Если вместо этого открыть и вернуть REF CURSOR, фактическое время выполнения SP и требуемая память будут меньше; но вы просто откладываете время выполнения на потом, когда извлекаете из курсора. Если есть хороший шанс, вам не нужно извлекать все строки; или если набор данных, вероятно, будет очень большим; или если выборка строк небольшими партиями позволяет вам выполнять какую-то другую значимую промежуточную работу (например, направлять их в другой поток или процесс, который на самом деле что-то с ними делает), то это может быть лучшим вариантом. Основным недостатком возврата курсора является то, что выборка из него, вероятно, потребует большего количества сетевых обращений, что в целом может быть медленнее, чем просто возврат данных сразу.
Неэффективное возвращение открытого REF CURSOR заключается в том, что с ним легче работать в некоторых клиентских средах (например, в JDBC он сопоставляется непосредственно с ResultSet, тогда как для типа вложенных таблиц вам необходимо выполнить дополнительную работу для предоставить Java информацию о типе).