Получение идентификатора вставляемой строки в Oracle с использованием последовательности и триггера для вставки идентификатора - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь получить значение столбца «автоинкремента» в 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;

Есть идеи, почему я получаю эту ошибку? Или любой другой способ сделать это без использования процедуры?

1 Ответ

0 голосов
/ 15 мая 2018

Предложение RETURNING является функцией языка PL / SQL. Вы не можете использовать его из обычных контекстов SQL, таких как сценарии SQL Developer, операторы SQL * Plus или JDBC. Это очень неудачно, конечно. Есть идея на этой платформе идей Oracle, за которую можно проголосовать, чтобы исправить это .

Вы можете, однако, обернуть свою инструкцию в анонимный блок, чтобы вернуться к контексту PL / SQL:

SET SERVEROUTPUT ON
DECLARE
  gen_id SD_LOG.ID_SD_LOG%TYPE;
BEGIN
  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;

  dbms_output.put_line(gen_id);
END;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...