Lo ottieni perché il tuo codice assegna uno scalare al tipo di output. È necessario eseguire il cast della variabile in modo che corrisponda all'obiettivo dell'assegnazione. Quindi:
SELECT type_struct(counter)
INTO rec
FROM dual;
Non hai necessariamente bisogno di una funzione pipeline. Possiamo usare table()
con qualsiasi funzione che restituisce una raccolta.
Ecco un'implementazione molto più semplice, che richiede un solo 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;
/