Я почти уверен, что эти вычисления можно выполнить внутри одного оператора select без необходимости создавать дополнительный курсор. Но, если вы все еще хотите этого, я покажу вам один возможный пример, как этого добиться.
Сначала вы должны объявить объект TYPE
. (Это будет представлять строку в результате запроса):
create or replace type MY_TYPE as object (
name varchar2(64),
surname varchar2(64),
calculatedValue varchar2(64) --your calculated column. You may add as many columns as needed, but for simplicity, I'll stick to only one column
);
Теперь создайте вложенную таблицу из MY_TYPE
объектов (она будет представлять весь набор результатов):
create or replace type MY_TYPE_LIST as table of MY_TYPE;
Теперь вы готовы написать конвейерную функцию для возврата нужного набора результатов.
create or replace function MY_FUNC return MY_TYPE_LIST pipelined as
cursor cur is
select name, surname from employees;
name varchar2(64);
surname varchar2(64);
calculatedColumn varchar2(64);
begin
open cur;
loop
fetch cur into name, surname;
exit when cur%notfound;
--do something here, calculate new columns
calculatedColumn := ...; --assign a value you want
pipe row (MY_TYPE(name, surname, calculatedColumn)); --the moment of truth. Pipe a row containing the new column
end loop;
end;
Эта функция вернет новый курсор, содержащий значения объекта MY_TYPE
.