Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.11.2012, 18:33   #1
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию NEW значение в UPDATE триггере Oracle

Здравствуйте, есть такой триггер с курсором
Код:
CREATE OR REPLACE TRIGGER Trg
BEFORE UPDATE OF Field1 ON Table1 FOR EACH ROW
DECLARE
    Cnt NUMBER := 0;
    CURSOR Cur IS 
      SELECT g.Name, g.Amount
      FROM Goods g
      WHERE g.Number = :new.Cnumber;
BEGIN
...
END;
что делает триггер не суть, проблема в том, что при изменении поля Field1, вылетает ошибка
Код:
ORA-04091: table OE.TABLE1 is mutating, trigger/function may not see it
ORA-06512: at "OE.TRG", line 8
ORA-04088: error during execution of trigger 'OE.TRG'
8 строка - это
Код:
WHERE g.Number = :new.Cnumber;
если заменить :new.Cnumber числом, то всё работает. Не могу понять почему, в BEFORE UPDATE триггере же можно использовать значение NEW.
Raz0r вне форума Ответить с цитированием
Старый 06.11.2012, 19:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://oracle-error.blogspot.com/200...g-trigger.html
Перепиши триггер так, чтоб он эту таблицу не пытался читать (не запрашивал с нее набор через SELECT)
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2012, 02:52   #3
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию

А если мне надо её прочитать, никак не сделать? Просто мне нужно получить значения полей обновляемой строки. Я раньше с oracle не работал и кроме как обращения к :NEW ничего в голову не приходит.
Raz0r вне форума Ответить с цитированием
Старый 07.11.2012, 09:41   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Просто мне нужно получить значения полей обновляемой строки.
старые значения доступны через префикс :OLD
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.11.2012, 16:16   #5
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
старые значения доступны через префикс :OLD
А как получить значение нового, обновляемого поля, ради которого собственно триггер и писался? А то как-то странно, триггер на BEFORE UPDATE, а новое введённое значение получить, чтобы его как-то проверить, не получается.

Последний раз редактировалось Raz0r; 07.11.2012 в 16:24.
Raz0r вне форума Ответить с цитированием
Старый 07.11.2012, 16:22   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

простите, не понял вопроса..
те значения, которые в данный момент в таблице - доступны через :OLD
те значения, которые, собственно, будут записаны в таблицу, доступны через :NEW

Вы что хотите получить то?! Для чего триггер нужен?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.11.2012, 17:50   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
а новое введённое значение получить, чтобы его как-то проверить, не получается.
Так нового и не будет, это же BEFORE триггер
Цитата:
простите, не понял вопроса..
Автор хочет перед обновлением некой записи получить набор записей, у которых поле Cnumber уже содержит значение, которое вносится в запись, и что-то с ними сделать.
Что-то типа синхронизации - изменение значения в одном поле должно повлиять на остальные с таким же значением. Если я угадал, то триггером тут не стоит пользоваться. Раз уж ты хочешь скрыть с глаз механику запроса - напиши пакет или просто отдельную процедуру, передавай в нее параметры, и в теле процедуры пропиши обновление. И пусть в клиенте используется эта процедура вместо открытого UPDATE запроса
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 07.11.2012, 20:15   #8
Raz0r
Пользователь
 
Регистрация: 06.11.2007
Сообщений: 47
По умолчанию

Всем спасибо за ответы, разобрался. Ошибка была в том, что я в теле триггера пытался прочитать из обновляемой таблицы. Отсюда и сообщение о 'mutating table'. А в BEFORE триггере есть и OLD и NEW тут было всё правильно)
Raz0r вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти значение на другом листе и подставить значение следующей ячейки ElenaNTro Microsoft Office Excel 12 11.02.2019 12:44
update kilogram SQL, базы данных 1 27.06.2012 16:33
Как просуммировать ячейки в которых значение более трех и значение болеетрех ячеек подряд? maruk Microsoft Office Excel 9 30.04.2011 00:07
Oracle+PHP как правильно получить значение Nexta_s PHP 1 03.03.2011 16:26
Update usmesn PHP 3 02.06.2010 17:23