2017-02-12 8 views
-2

У меня проблема при попытке вызывать последовательность с помощью триггера insert.Связать переменную в SQL Developer с Oracle 11g

CREATE TABLE personne (ID number, nom varchar2(250 char)); 

CREATE SEQUENCE s_inc_pers START WITH 1 INCREMENT BY 1; 

CREATE TRIGGER tr_inc_pers ON t1 BEFORE INSERT 
FOR EACH ROW 
DECLARE 
BEGIN 
    select s_inc_pers into :new.t1.ID from DUAL; 
END. 
+2

Это обычно помогает людям ответить быстрее и лучше, если вы включите вид проблем, которые вы испытываете в исходном вопросе: например, сообщения об ошибках или поведение, которое вы испытываете, и как оно отличается от того, что вы ожидаете –

ответ

2

Oracle сообщает о плохой переменной привязки, если вы пытаетесь ссылаться на что-то с :NEW, что это не столбец в таблице назначения. В этом случае может потребоваться указать значение привязки, поскольку инструкция неверна.

The NEW pseudorecord относится к строке в таблице запуска, на которую влияет инструкция. Вам не нужно (и не обязательно) включать имя таблицы, когда вы используете поле псевдослужбы, поэтому :new.t1.ID должно быть только :new.ID.

К get the next value from the sequence необходимо использовать nextval, вы можете не только указать название последовательности.

Ваши предложения также в неправильном порядке, вам нужно событие DML (вставить) befroe целевой таблицы.

CREATE TRIGGER tr_inc_pers BEFORE INSERT ON t1 
FOR EACH ROW 
BEGIN 
    select s_inc_pers.nextval into :new.ID from DUAL; 
END; 

Как вы используете 11g вам даже не нужно выбирать из двух, you can just assign the column value:

CREATE TRIGGER tr_inc_pers BEFORE INSERT ON t1 
FOR EACH ROW 
BEGIN 
    :new.ID := s_inc_pers.nextval; 
END; 
+0

@mathguy - ха-ха, спасибо. D'о. –