Модераторы: LSD
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите написать триггер на обработку данных 
V
    Опции темы
nikolja1990
Дата 19.3.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.10.2010

Репутация: нет
Всего: нет



Всем доброго времени суток.

Ситуация: имеется база данных и в ней есть 2 связанные таблицы:  первая - учебные заведения, вторая площади этим учебным заведениям принадлежащие. Я написал триггер который после каждой вставки (как только с ним разберусь, напишу еще на изменение и удаление) в таблицу площадь должен считать сумму всех площадей принадлежащих данному учебному заведению и обновлять данное значение в таблицы учебных заведений, получилось вот так:

CREATE OR REPLACE TRIGGER sumArea
AFTER INSERT ON Area
FOR EACH ROW
DECLARE
    totalAreaTemp DECIMAL(3, 2);
BEGIN
    SELECT SUM(SizeArea) INTO totalAreaTemp FROM Area WHERE Area.InstitutionId = :NEW.INSTITUTIONID;
    UPDATE Institution SET TotalArea = totalAreaTemp WHERE Institution.INSTITUTIONID = :NEW.INSTITUTIONID;
END;
/

в дримкодере триггер создается и показывает что ошибок не содержит.

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

Executed successfully in 0.018 s, 0 rows affected.
Line 1, column 1

Error code 6550, SQL state 65000: ORA-06550: line 2, column 99:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   ;

Line 6, column 1

Error code 1008, SQL state 72000: ORA-01008: not all variables bound

Line 8, column 5

Error code 900, SQL state 42000: ORA-00900: invalid SQL statement

Line 9, column 1

Execution finished after 0.018 s, 3 error(s) occurred.


В общем создал триггер через дримкодер. При попытке вставить данные в таблицу Area и в дримкодере и в нетбинсе  выскакивает такое сообщение:

Error code 4091, SQL state 42000: ORA-04091: table NIKOLJA.AREA is mutating, trigger/function may not see it
ORA-06512: at "NIKOLJA.SUMAREA", line 4
ORA-04088: error during execution of trigger 'NIKOLJA.SUMAREA' insert!

объясните нубу - что я делаю не так? Заранее спасибо.

Добавлено через 6 минут и 17 секунд
ах да! совсем забыл! используется oracle 10g XE, dreamCoder for Oracle Enterprise Freeware Edition 6.0 Build(6.0.2.0), NetBeans 7.1.1

Присоединённый файл ( Кол-во скачиваний: 0 )
Присоединённый файл  скрипт_бд.sql 3,78 Kb
PM MAIL   Вверх
Zloxa
Дата 19.3.2012, 15:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 37
Всего: 161



Цитата(nikolja1990 @  19.3.2012,  16:24 Найти цитируемый пост)
 ORA-04091: table NIKOLJA.AREA is mutating, trigger/function may not see it

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

Цитата(nikolja1990 @  19.3.2012,  16:24 Найти цитируемый пост)
обновлять данное значение в таблицы учебных заведений

Код

CREATE OR REPLACE TRIGGER sumArea
AFTER INSERT or update or delete ON Area
FOR EACH ROW
BEGIN
  if :old.SizeArea is not null then 
    UPDATE Institution SET TotalArea = totalArea - :old.SizeArea  WHERE Institution.INSTITUTIONID = :old.INSTITUTIONID;
  end if;    
  if :new.SizeArea is not null then 
    UPDATE Institution SET TotalArea = nvl(totalArea,0) + :new.SizeArea  WHERE Institution.INSTITUTIONID = :new.INSTITUTIONID;
  end if;    
END;
/

Очень надеюсь, что от Institution к Area прокинут fk по INSTITUTIONID. Без него такой триггер может начудить.
Еще могут случиться взаимные блокировки, если один пользователь захватит Institution и встанет на блокировке Area которая захвачена другим пользователем, который, в то же время, пытается захваттить Institution, который уже захватил первый пользователь. Избежать взаимных блокировок можно вызывав select for update nowait перед апдейтом.

Добавлено @ 16:03
Вообще, обычно, аггрегаты считают при модификации только в тех случаях, когда посчитать их при выборке оказывается проблематичным. Мне кажется у вас далеко не тот случай.

Это сообщение отредактировал(а) Zloxa - 20.3.2012, 08:45


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
nikolja1990
Дата 19.3.2012, 16:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 22.10.2010

Репутация: нет
Всего: нет



Цитата(Zloxa @  19.3.2012,  15:52 Найти цитируемый пост)
Очень надеюсь, что от Institution к Area прокинут fk по INSTITUTIONID. Без него такой триггер может начудить.

Я конечно нуб но не настолько smile 

Большое спасибо! Все заработало))))

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1105 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.