Просмотр - хороший ответ (спасибо Гари ), но есть и другая возможность.
Вы можете создать тип объекта в схеме базы данных и ссылочный тип таблицы:
create or replace type TFooDataRecord as object (
quantity number,
amount number
);
create or replace type TFooDataList as table of TFooDataRecord;
затем объявите функцию, возвращающую требуемые результаты:
create or replace function GetFoo(pAncestor in number) return TFooDataList
as
vResult TFooDataList;
begin
select TFooDataRecord(quantity, amount)
bulk collect into vResult
from TBRawData, (select ... where ancestor = pAncestor) temp,
where TBRAWData.StoreID = temp.StoreID;
return vResult;
end;
затем вы можете использовать функцию в операторах выбора и соединениях:
select foo_func.amount
from
table( GetFoo(123) ) foo_func,
some_another_table foo2
where
foo_func.quantity < foo2.quantity
Конечно, вы можете поместить функцию в пакет.
Но не объявления типа объекта и таблицы.
Это решение применимо, если число строк, возвращаемых функцией, не слишком велико (зависит от аппаратного обеспечения сервера, но обычно не более 1000-2000 записей).
Это лучше, чем использование представления, поскольку Oracle будет поддерживать один скомпилированный и кэшированный план для параметризованного запроса и не перестраивать его для каждого запроса, как в случае решения с представлением.