При создании триггера ошибка: PLS-00103: Encountered the symbol "INSERT"
У меня имеется таблица crafts(id_craft,name_craft), в которой каждое ремесло имеет уникальный номер. Чтобы не задавать его вручную я использую триггер:
CREATE OR REPLACE TRIGGER trig_craft
BEFORE INSERT ON crafts
FOR EACH ROW
BEGIN
SELECT craft_sqn.NEXTVAL
INTO :new.id_craft
FROM dual;
END;
А затем я пишу какое-нибудь выражение, например:
INSERT INTO crafts
(name_craft)
VALUES('Ловля рыбы');
и появляется ошибка
PLS-00103: Encountered the symbol "INSERT"
Правильно ли я понимаю, что этот запрос воспринимается как продолжение триггера? И что нужно сделать, чтобы исправить ошибку?
Ответы (2 шт):
CREATE OR REPLACE TRIGGER trig_craft
BEFORE INSERT ON crafts
FOR EACH ROW
BEGIN
SELECT craft_sqn.NEXTVAL
INTO :new.id_craft
FROM dual;
END;
/
Прежде всего, начиная с 11g можно присваивать следующее значение последовательности напрямую в переменную, то есть без запроса:
create or replace trigger trig_craft
before insert on crafts for each row
begin
:new.id_craft := craft_sqn.nextval;
end;
Правильно ли я понимаю, что этот запрос воспринимается как продолжение триггера?
Да, правильно. Последняя ; являются частью синтаксиса PL/SQL. Клиент, который посылает выражение CREATE, должен знать, где оно заканчивается. В большинстве консольных клиентов для этого служит / (только один слэш в новой строке) -
закончить запись в буфер и послать его на выполнение.
В клиентах с графическим интерфейсом достаточно выделить полное выражение и нажать комбинацию клавиш - «Выполнить». Посмотрите, недействительное выражение xxxxxx никак не мешает:
Trigger TRIG_CRAFT compiled
