Во-первых, не используйте max(<value>) + 1
для поиска новых значений для столбца - это не очень хорошо для одновременных сеансов.
Вместо этого вы должны создать последовательность и использовать ее в своих вставках.
Далее, если вы пытаетесь выполнить upsert (обновить строку, если она существует, или вставить, если она не существует), вы можете использовать инструкцию MERGE. В этом случае вы пытаетесь вставить строку, если она еще не существует, поэтому вам не нужна часть обновления.
Поэтому вы должны делать что-то вроде:
CREATE SEQUENCE animaldata_seq
START WITH <find MAX VALUE OF animaldata.first>
INCREMENT BY 1
MAXVALUE 9999999999999999
CACHE 20
NOCYCLE;
MERGE INTO animaldata tgt
USING (SELECT 'Animals' category,
'Lion' animal,
10 num_animals,
NULL unknown_col,
TRUNC(SYSDATE) date_added,
'STOP' action
FROM dual) src
ON (tgt.animal = src.animal)
WHEN NOT MATCHED THEN
INSERT (<list of animaldata columns>)
VALUES (animaldata_seq.nextval,
src.animal,
src.unknown_col,
src.date_added,
src.action);
Обратите внимание, что я попытался указать столбцы, которые нужно вставить, - это хорошая практика! Код, в котором есть операторы вставки, в которых нет списка вставляемых столбцов, подвержен ошибкам, если кто-то добавит столбец в таблицу.
Я также предположил, что столбец, в который вы добавляете дату, имеет тип данных DATE; Я использовал sysdate (усеченное для удаления части времени) в качестве значения для вставки, но вы можете указать, какую дату использовать, и в этом случае вы должны использовать to_date(<string date>, '<string date format')