2016-06-30 2 views
0

Моя задача довольно проста, допустим, у меня есть таблица с 3 столбцами, то есть temp (ids, name_c, UID_c), и у меня есть первые два значения столбца, а третий столбец - нулевая. То, что я хочу сделать, - это когда все эти два значения вставлены, значение третьего столбца должно быть обновлено (после вставки) с новым значением. т. е. конкатенация обоих значений.Обновление значения другого столбца при вставке в oracle

Для примера.

insert into temp(ids, name_c) values(did.nextval,'Andrew'); 

Результат должен быть

 1   Andrew   Andrew_1 

Так я использую триггер для этой цели

create or replace trigger triggerDemo 
    after INSERT 
    on temp 
    for each row 
    declare 
    /* pragma autonomous_transaction;*/ 
    user_name varchar2(50); 
    current_val number; 
    begin  
    select did.currval into current_val from dual; /* did is sequence */ 
    select names into user_name from temp where ids = current_val; 
    update temp set uid_c = user_name||'_'||ids where ids = current_val; 
    end; 

Когда я вставив значения я получаю эту ошибку

01403. 00000 - "no data found" 
    *Cause: No data was found from the objects. 
    *Action: There was no data from the objects which may be due to end of fetch. 

ответ

0

Во-первых, вы хотите before insert триггер, а не after insert триггер. Во-вторых, решите, хотите ли вы рассчитать id на входе или в триггере. Вы можете сделать что-то вроде этого:

create or replace trigger triggerDemo before INSERT on temp 
for each row 
    /* pragma autonomous_transaction;*/ 
begin 
    if :new.current_val is null then 
     select did.currval into :new.ids from dual; /* did is sequence */ 
    end; 
    select :new.user_name || '_' || :new.ids into :new.uid_c from dual; 
end; 
Смежные вопросы