Я создаю триггер A1, так что статья с определенным типом, то есть «Bert», не может быть добавлена несколько раз, и она может иметь только 1 на складе. Однако, хотя я создаю триггер, я все же могу добавить статью с типом «Берт». Так или иначе, count возвращает «0», но когда я запускаю тот же оператор sql, он возвращает правильное число. Он также начинает правильно подсчитываться, если я удаляю триггер и снова добавляю его. Любые идеи, что может пойти не так?Count (*) не работает должным образом
TRIGGER A1 BEFORE INSERT ON mytable
FOR EACH ROW
DECLARE
l_count NUMBER;
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT COUNT(*) INTO l_count FROM mytable WHERE article = :new.article;
dbms_output.put_line('Count: ' || l_count);
IF l_count >0 THEN
IF(:new.TYPEB = 'Bert') THEN
dbms_output.put_line('article already exists!');
ROLLBACK;
END IF;
ELSIF (:new.TYPEB = 'Bert' AND :new.stock_count>1) THEN
dbms_output.put_line('stock cannot have more than 1 of this article with type Bert');
ROLLBACK;
END IF;
END;
Это заявление вставки я использую:
INSERT INTO mytable VALUES('Chip',1,9,1,'Bert');
Count возвращает 0, потому что, когда вы вставляете его, в моей таблице нет строки, где статья такая же, как та, которую вы пытаетесь вставить. Во второй раз, когда вы запускаете свой SQL-запрос и запускаете триггер, он возвращает 1. Единственное объяснение этого поведения. Когда вы бросаете триггер, вы также удаляете записи, которые были добавлены ранее? –
output.putline продолжает причислять «Count: 0» каждый раз, когда я вставляю. Не только в первый раз. – Sammy
Почему вы не используете для этого уникальное ограничение? –