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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ORA 04091, в триггерах 
:(
    Опции темы
p0s0l
Дата 6.10.2006, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Пару триггеров пытался сделать, и такая ошибка вылазит:
Цитата(Error)
ORA-04091: table USER.EMPLOYEE is mutating, trigger/function may not see it


Вот пример:
Код

create or replace trigger EMPLOYEE_BUR
  before update on employee  
  for each row
declare
  -- local variables here
begin
  IF IsChildOf(:new.manager_id, :new.id) THEN
    raise_application_error(-20201, 'Попытка образования цикличности подчиненных!');
  END IF;  
end ;


Ошибка выскакивает в этой процедуре на выборке данных.
Код
create or replace function IsChildOf(pId IN NUMBER, pManager_id IN NUMBER) return boolean is
  Result boolean;
  cnt number;
  
begin
  IF pId = pManager_id THEN
    return(True);
  END IF;
  
  SELECT COUNT(*) INTO cnt FROM employee e
         START WITH e.id = pManager_id
         CONNECT BY PRIOR e.id=e.manager_id
         WHERE e.id=pId;

  IF cnt = 1 THEN 
    return(True);
  ELSE 
    return(False);
  END IF;
end IsChildOf;


Как-нибудь это можно обойти без особой мороки (иначе просто по-другому сделаю) ?


--------------------
С уважением, г-н Посол.
PM   Вверх
batigoal
Дата 6.10.2006, 15:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

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



Как я понял из описания ошибки, ты пытешь читать ту самую таблицу, которую в данный момент изменяешь. Этого делать нельзя.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
3x3
Дата 6.10.2006, 20:28 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(p0s0l @ 6.10.2006,  12:53)
Как-нибудь это можно обойти без особой мороки (иначе просто по-другому сделаю) ?

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


--------------------
Зачем платить больше,
когда можно заплатить дважды?
PM   Вверх
p0s0l
Дата 7.10.2006, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Ок, спасибо за ответы! smile
Сделаю "по-другому"



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

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

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

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

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

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


 




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


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

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