Получавате това, защото вашият код присвоява скаларен тип на изходния тип. Трябва да преобразувате променливата, за да съответства на целта за присвояване. И така:
SELECT type_struct(counter)
INTO rec
FROM dual;
Не е задължително да се нуждаете от конвейерна функция. Можем да използваме table()
с всяка функция, която връща колекция.
Ето една много по-проста реализация, която изисква само един UDT.
CREATE TYPE tp_numbers AS TABLE OF number;
/
CREATE OR REPLACE FUNCTION gen_nums (na NUMBER, nb NUMBER)
RETURN tp_numbers
IS
return_value tp_numbers ;
BEGIN
SELECT (na + level) - 1
bulk collect INTO return_value
FROM dual
connect by level <= nb;
RETURN return_value ;
END gen_nums;
/