2015-04-19 3 views
1

Я написал процедуру следующим образомReverse значения фиксого Oracle SQL

Create or replace procedure raise_salary(
v_id IN emp.empno%TYPE) AS 
Begin 
    update emp 
    set sal = sal*1.10 
    where empno=v_id; 
    commit; 
End; 

я понял, что я не создать исключение для отката значения. Я хочу вернуться к первоначальному значению. значение не может быть уменьшено, так как я получаю следующую ошибку. ORA-20187: Оклады не могут быть уменьшены

как вернуться к исходному значению. Я отбросил процедуру, но теперь, когда я ее уже выполнил, она уже увеличила ее. Кажется, теперь это фиксированное значение. Что я делаю?

ответ

1

Отказ от процедуры не имеет ничего общего с реверсированием эффектов ее запуска.

Похоже, что на столе есть триггер, препятствующий выполнению обновления, которое вы хотите сделать. Один из вариантов - отключить триггер. Стек ошибки из обновления должен сообщить вам свое имя. Вы должны выполнить ALTER TRIGGER <triggername> DISABLE, а затем запустить свое обновление, затем «ALTER TRIGGER ENABLE».

Другим возможным обходным решением может быть вставка строки во вторую таблицу, обновление ее там, а затем удаление и повторная установка ее в исходную таблицу. Это также может привести к запуску триггеров, если кто-то попытался предотвратить вставки или удаления в таблице.

Все это предполагает, что вы находитесь в среде, в которой целесообразно обход логического управления, реализуемого кем-то другим. Предположительно, триггер существует по какой-то причине.

+0

Благодарим вас, вы были правы насчет спускового крючка. Я ЛЮБЛЮ Stackoverflow – ITInquisitor

0
select trigger_name from user_triggers where table_name='EMP' 

Показывает триггеры имен таблицы, которые вы хотите откат. Затем отключите их, как показано в предыдущем ответе. Не позволяйте им возвращаться.

Begin 
For cur in (select trigger_name from user_triggers where tbale_name='EMP') loop 
Execute immediate 'alter trigger'||cur.trigger_name||' disable'; 
Update emp set ....your update DML; 
Execute immediate 'alter trigger'||cur.trigger_name||' enable'; 
end loop; 
End; 

Надеюсь, это поможет вам.

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