Vous obtenez cela parce que votre code attribue un scalaire au type de sortie. Vous devez caster la variable pour qu'elle corresponde à la cible de l'affectation. Donc :
SELECT type_struct(counter)
INTO rec
FROM dual;
Vous n'avez pas nécessairement besoin d'une fonction en pipeline. Nous pouvons utiliser table()
avec n'importe quelle fonction qui retourne une collection.
Voici une implémentation beaucoup plus simple, qui ne nécessite qu'un seul 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;
/