Когда вы создали свою таблицу, вы должны были создать TRIGGER и SEQUENCE для запуска перед вставкой на вашу таблицу и отловить, если: NEW.PRIMAY_KEY имеет значение null, затем получить его из последовательности.
Использованиеэтим методом вы всегда будете избегать DUP_VAL_ON_INDEX.
Я бы не использовал WHEN OTHERS, поскольку он не имеет реального применения в реальной логике обработки ошибок.