Есть несколько проблем с вашим первоначальным подходом.Хотя выбранный ответ правильно предоставляет способ определения текущего значения последовательности, это не решает эти проблемы:
- Значение последовательности могло измениться между вызовами NEXTVAL и CURRVAL.Это приведет к трудно обнаруживаемой ошибке, и есть вероятность, что вы получите значение, используемое другим сеансом. Используйте возвращаемое предложение в операторе вставки для извлечения фактического вставленного значения.
- Ваши имена переменных совпадают с именами столбцов.Это приведет к трудному обнаружению ошибок в запросах, встроенных в блоки PL / SQL. Убедитесь, что ваши переменные названы по-разному - вы можете добавить к ним префикс из имени типа, например v_userid, а не userid.
Оператор SELECT внутри блока Oracle PL / SQL требует предложения INTO, Пример:
ВЫБРАТЬ идентификатор пользователя INTO v_userid ОТ bs_orders WHERE ono = orderNumberSEQ;
Подзапрос для current_timestamp является избыточным. Вы можете использовать простой CURRENT_TIMESTAMP вместо подзапроса для достижения того же результата.
Вместо того, чтобы вручную указывать тип столбца. Привязать его к точному типу таблицы, используя нотацию% type.
v_userid bs_orders.userid% type;
Следующий код решает все 5 проблем.
DECLARE
v_userid bs_orders.userid%type; -- anchoring the type
BEGIN
INSERT INTO bs_orders(userid , ono , timepurchased)
VALUES('lilith', orderNum_seq.NEXTVAL, CURRENT_TIMESTAMP)
RETURNING userid INTO v_userid; -- instead of currval and an additional select
-- do whatever you want with v_userid here
END;
/