Вставка последовательности, используя триггер

griboyedov

Пытаюсь вставить последовательность, с помощью триггера, но выдаёт ошибки. Error(2,3): PL/SQL: SQL Statement ignored Error(4,5): PL/SQL: ORA-00947: not enough values Error(5,6): PLS-00049: bad bind variable 'SEQ1.NEXTVAL'
CREATE TABLE goods (
    id INT CONSTRAINT id_pk2 PRIMARY KEY,   
    goods_name VARCHAR(30), 
    shop_id INT  REFERENCES Fominskiy_8I42_Shop (number_),
    goods_type VARCHAR(30) 
);
 
CREATE SEQUENCE seq1
INCREMENT BY 1000
START WITH 1000
MAXVALUE 99000;
 
 
CREATE OR REPLACE TRIGGER tr
  AFTER INSERT ON Fominskiy_8I42_employee FOR EACH ROW
BEGIN
  INSERT INTO Fominskiy_8I42_employee 
    (id, employee_name, shop_id, vacation_start, vacation_end) 
    VALUES
    (:seq1.nextval,:NEW.Employee_name, to_date(':NEW.vacation_start', 'DD.MM.YYYY'), to_date(':NEW.vacation_end', 'DD.MM.YYYY'));
END;
1 ответ

griboyedov

bad bind variable 'SEQ1.NEXTVAL'
При вызове последовательностей не нужно двоеточие. Надо писать просто seq1.NEXTVAL
not enough values
Разумеется. В insert into... указано пять полей, а в values - только четыре.На кой черт делается INCREMENT BY 1000 и START WITH 1000 ? Здесь Вам не там. Никаких промежутков делать не надо. Только хуже будет.Чтобы понять, с чем связана первая ошибка, нужно больше информации. В частности, желательно иметь DDL-ки таблиц Fominskiy_8I42_Shop и Fominskiy_8I42_employee, чтобы воспроизвести все и понять, в чем ошибка. Но самая капитальная ошибка - нельзя в триггере на таблицу делать вставку в эту же таблицу. Эта ошибка проявляется run time, а не при создании триггера, поэтому самые проблемы у Вас еще впереди.Если Вам нужен пример использования последовательности в триггере посмотрите по этой ссылке Таблицы, которая мутирует или триггер. PL/SQL Oracle код после слов
Создаем таблицу Client с триггером
Кстати, Ваш триггер неправилен еще и потому, что дату нельзя ставить в апострофы. И вообще, на мой взгляд, триггер достаточно написать как
CREATE OR REPLACE TRIGGER tr
  BEFORE INSERT ON Fominskiy_8I42_employee FOR EACH ROW
BEGIN
  :NEW.id := seq1.NEXTVAL;
END;
если у Вас Oracle 11 или выше, а если до Oracle 10 (?) включительно, то
CREATE OR REPLACE TRIGGER tr
  BEFORE INSERT ON Fominskiy_8I42_employee FOR EACH ROW
BEGIN
  SELECT seq1.NEXTVAL INTO :NEW.id  FROM dual;
END;
Все остальное абсолютно лишнее.Триггер в данном случае должен быть BEFORE, а не AFTER.