Я пытаюсь получить значение столбца «автоинкремента» в Oracle db. Для создания этого столбца я использую последовательность и триггер.
Создание скрипта:
create table SD_LOG (
ID_SD_LOG number(19) primary key,
LOG_DATE timestamp(3) default systimestamp NOT NULL,
MODULE nvarchar2(15) NOT NULL,
INSTANCE number(5) NOT NULL,
REMOTE_ADDR nvarchar2(39) NOT NULL,
USERNAME nvarchar2(30) NOT NULL,
USER_AGENT nvarchar2(1024) NOT NULL,
HTTP_METHOD nvarchar2(8) NOT NULL,
HTTP_REQ_URL nvarchar2(1024) NOT NULL,
HTTP_STATUS number(5),
ERROR nvarchar2(100),
DETAILS clob
);
/
-- Generate ID using sequence and trigger
create sequence SD_LOG_seq start with 1 increment by 1;
create or replace trigger SD_LOG_seq_tr
before insert on SD_LOG for each row
when (new.ID_SD_LOG is null)
begin
select SD_LOG_seq.nextval into :new.ID_SD_LOG from dual;
end;
/
Каждый раз, когда я делаю вставку, мне нужно получить значение, созданное ID_SD_LOG для последующего обновления строки.
Я последовал за некоторыми другими вопросами, но по какой-то причине мое заявление не соответствует:
Ошибка SQL: ORA-00905: отсутствует ключевое слово
Это утверждение, которое я пытаюсь выполнить (вставка в одиночку, без 'RETURNING ...' работает отлично):
INSERT INTO SD_LOG
(MODULE, INSTANCE, REMOTE_ADDR, USERNAME, USER_AGENT, HTTP_METHOD, HTTP_REQ_URL)
VALUES
('modulename', '1', '192.168.0.1', 'User Name', 'blah blah blah blah', 'POST', '/page?query=1234567890')
RETURNING ID_SD_LOG INTO gen_id;
Есть идеи, почему я получаю эту ошибку? Или любой другой способ сделать это без использования процедуры?