Cela ne fonctionnera pas. RETURNING
la clause ne peut pas être utilisée comme vous le faites, c'est-à-dire
insert into t (id, my_pk)
select some_id, your_function from ...
returning into v_output
mais cela fonctionnerait si vous insériez VALUES
, comme
insert into t
values (id, your_function)
returning my_pk into v_output
Cela signifie que vous devrez soit réécrire ce code, soit rechercher une solution de contournement décrit dans retour avec insert..select article (écrit par Adrian Billington).
BTW, une séquence Oracle ordinaire ne conviendrait-elle pas à votre objectif ? Ne sera pas sans lacunes, mais serait simple et efficace. Faites attention aux performances lors de l'insertion d'une énorme quantité de données, en utilisant votre solution.
BTW #2, à quoi sert la dernière ligne de votre fonction ? Vous n'utilisez jamais N_VALUE.