Последовательность триггера проблема оракула - PullRequest
1 голос
/ 04 декабря 2009

У меня есть последовательность:

CREATE SEQUENCE test_seq START WITH 10000001 INCREMENT BY 1;

и стол:

create table Entry(
id number(5),
name varchar(50)  );

Мне нужно увеличить значение последовательности после вставки строки в таблицу Entry. Итак, я сделал это:

CREATE OR REPLACE TRIGGER test_trigger
after INSERT
ON Entry
REFERENCING NEW AS NEW
FOR EACH ROW
BEGIN
SELECT test_seq.nextval INTO :NEW.id FROM dual;
END;
/

но « после » здесь не работает, но « до » работает. Как я могу сделать это после?

Ответы [ 4 ]

2 голосов
/ 04 декабря 2009

Если вы действительно хотите увеличить последовательность после вставки (что кажется странным), вы можете сделать это:

CREATE OR REPLACE TRIGGER test_trigger
after INSERT
ON Entry
REFERENCING NEW AS NEW
FOR EACH ROW
DECLARE
    l_id INTEGER;
BEGIN
    SELECT test_seq.nextval INTO l_id FROM dual;
END;
/

Конечно, это не устанавливает идентификатор новой строки в это значение последовательности - но если бы вы захотели это сделать, вы бы сделали это триггером ДО.

1 голос
/ 04 декабря 2009

Согласно этой документации , вы не можете обновлять: NEW значения при использовании триггера AFTER INSERT. Извините!

1 голос
/ 04 декабря 2009

Обычно вы вызываете sequence.nextval в самом операторе INSERT:

INSERT INTO your_table
   (id, ...)
VALUES
   (test_seq.nextval, ...)

Вы настроены на использование триггера?

0 голосов
/ 26 января 2010

Я не могу понять, почему вы хотите увеличить последовательность после вставки; при этом вы потеряете значительное количество значений, потому что контекст последовательности CURRVAL не может быть запрошен в сеансе, пока этот сеанс не вызовет NEXTVAL один раз.

Запуск следующего вызовет ORA-08002:

create sequence s1;
select s1.currval from dual;

Итак, как вы кодировали его с помощью триггера после вставки, откуда берется первое значение для entry.id?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...