To nie zadziała. RETURNING
klauzula nie może być użyta w taki sposób, w jaki to robisz, tj.
insert into t (id, my_pk)
select some_id, your_function from ...
returning into v_output
ale zadziała, jeśli wstawisz VALUES
, jak
insert into t
values (id, your_function)
returning my_pk into v_output
Oznacza to, że będziesz musiał albo przepisać ten kod, albo spojrzeć na obejście opisane w powrót z insertem..select artykuł (napisany przez Adriana Billingtona).
BTW, czy zwykła sekwencja Oracle nie pasowałaby do twojego celu? Nie będzie bez przerw, ale będzie proste i skuteczne. Zwróć uwagę na wydajność podczas wstawiania dużej ilości danych przy użyciu swojego rozwiązania.
BTW #2, jaki jest cel ostatniej linii w twojej funkcji? Nigdy nie używasz N_VALUE.