2015-07-10 2 views
1

Я не могу найти правильную структуру для следующего вопроса в pl/sql: нужен триггер на «таблице продуктов», который будет проверять цену перед вставкой нового продукта, цена продукта не должна превышать 4000 $.Вставить триггер в pl/sql

CREATE or REPLACE TRIGGER pro 
BEFORE UPDATE OF price 
ON products 
FOR EACH ROW 
declare 
pr products.price%type; 
BEGIN 
if pr < 4000 then 
INSERT INTO products VALUES (:old.product_ID,:old.price); 
end if; 
END; 

Пожалуйста, помогите

+0

Не могли бы вы добавить некоторые подробности того, что вы спрашиваете? Это не очень ясно прямо сейчас ... – bcdan

+0

Ваш код имеет ПЕРЕД ОБНОВЛЕНИЕМ, но ваш вопрос о INSERT ...? –

+0

да его до обновления, но мне нужно, чтобы он был вставкой, который я не мог сделать .. может, пожалуйста, помогите в этом? – Jaad

ответ

3

Использование check constraint вместо запуска:

create table products (price number); 

ALTER TABLE PRODUCTS ADD CONSTRAINT check_price CHECK (price < 4000); 

Тест:

insert into products values (5000) => ERROR 

Edit: Если Вы настаиваете на спускового версии:

CREATE or REPLACE TRIGGER pro BEFORE insert or UPDATE OF price ON products 
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
    raise_application_error(-20101, 'Price exceeds 4000.'); 
end if; 
END; 
+0

Мне нужно это, используя функцию триггера в PL/SQL – Jaad

+0

Спасибо, просто чтобы убедиться, что вы использовали «вставить или обновить» вопрос, который я пытаюсь решить, это только вставка. Это точное решение? Я не уверен, поскольку я новичок в pl/sql – Jaad

+0

Но в ваших попытках вы написали: _before update_, поэтому я сделал версию для вставки и обновления - это кажется наиболее логичным. Конечно, вы можете удалить 'update'', если вы этого не хотите. Но в текущей версии это универсально. –

1

Единственная причина, вы бы заморачиваться с триггером для этого вместо проверочного ограничения является контроль сообщение об ошибке. И помните, что триггер предполагает, что операция выполняется, поэтому, чтобы остановить операцию, ваш инструмент должен создать исключение.

CREATE OR REPLACE TRIGGER pro 
BEFORE INSERT OR UPDATE 
ON products 
FOR EACH ROW 
BEGIN 
if :new.price > 4000 then 
    RAISE_APPLICATION_ERROR(-20001,'Price exceeds maximum permitted value') ; 
end if; 
END; 
+0

получил эту ошибку «не может создавать триггеры на объектах, принадлежащих SYS» – Jaad

+0

, почему вы положили это значение -20001? – Jaad

+0

Определяемые пользователем исключения должны соответствовать кодексу Oracle Error + Message format, а Oracle резервирует диапазон от -20000 до -20999 для пользовательских исключений. Все остальные коды ошибок являются для них только для внутреннего использования. –

1

, если вам не нравится поднимать ошибки и просто сохранить старые значения, как я думаю, используйте этот код:

CREATE or REPLACE TRIGGER pro 
     BEFORE UPDATE OF price 
     ON products 
     FOR EACH ROW 
declare 
    pr products.price%type; 
BEGIN 
    if :new.price > 4000 then 
    :new.price := :old.price; 
    :new.product_ID := :old.product_ID; 
    end if; 
END; 
+0

получил эту ошибку «не может создавать триггеры на объектах, принадлежащих SYS». – Jaad

+0

@ Jaad, можете ли вы рассказать мне, что является владельцем таблицы продуктов? – hmmftg

+0

Я использую sys/sys as sysdba – Jaad

Смежные вопросы