2014-01-09 5 views
0

Я строю триггер действовать до вставки, чтобы сделать две вещи: - отвергаем заданные значения (работы) - обновление нулевые значения (не могу заставить его работать)Trigger для обновления содержимого вставки

таблица триггера выглядит следующим образом:

Хотя сам триггер выглядит следующим образом:

CREATE OR REPLACE TRIGGER name_a_i 
BEFORE INSERT ON krasnoludki FOR EACH ROW 
    DECLARE 
    v_count NUMBER := 0; 
    BEGIN 

    IF initcap(:new.name) LIKE 'Adrian%' THEN 
     raise_application_error(-20001, 'Name starting with Adrian is prohibited');   
    ELSE 

     IF :new.name = '' OR :new.name IS NULL THEN 
     SELECT count(*) INTO v_count 
     FROM peeps 
     WHERE initcap(name) LIKE 'No_%'; 

     UPDATE peeps 
     SET name = concat('No_', v_count + 1) 
     WHERE name = :new.name; 
     END IF; 

    END IF; 
    END name_a_i; 

Все компилируется, но когда я положил null значение как имя не обновляет значение null до No_%.

Пожалуйста, скажите мне, что я делаю неправильно?

Это Oracle DB.

ответ

0

С: NEW.name является NULL, это обновление

Update peeps set name = concat('No_',v_count+1) where name = :NEW.name; 

не будет работать, так как имя =: NEW.name не будет работать.

Вам необходимо изменить свою логику.

Я думаю, что вы ищете что-то вроде этого:

select count(*) into v_count from peeps where initcap(name) like 'No_%'; 
:NEW.name := concat('No_',v_count); 
Update peeps set name = concat('No_',v_count+1) where name = :NEW.name; 

это обновит имя и таблицы, а также.

+0

Да, это так, большое вам спасибо, но если бы вы могли объяснить мне логику этого, так как я хочу знать, как она функционирует не только как это сделать. Итак: NEW.name является указателем и до конца триггера я могу перетасовать его значение, как я хочу? – plomien

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