powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обход мутирования таблицы
11 сообщений из 11, страница 1 из 1
Обход мутирования таблицы
    #39244091
Есть табличка t с полями v1 и v2
В поле v1 надо все время иметь количество записей в таблице с полем v1, т.е по сути выполнить запрос
Код: plsql
1.
2.
3.
4.
5.
update t
set    t.v2 =
       (select count(*)
        from   t t1
        where  t1.v1 = t.v1)



Можно ли это сделать, не заводя дополнительный пакет и не применяя автономные транзакции?
Oracle 11g, т.е есть compound triggers но не соображу как предотвратить рекурсивный вызов, выполняя запрос в after statement
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39244117
on update of column
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> как предотвратить рекурсивный вызов
Проверкой на изменяемое поле?
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39244118
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быдло___кодеркак предотвратить рекурсивный вызов, выполняя запрос в after statement

Пакетная переменная, которая анализируется в триггерах.
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39244119
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон, пропустил "не заводя дополнительный пакет".
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39244137
Фотография orawish
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быдло___кодер,

поищите на тему восходящей денормализации

а лучше - убейте об стену постановщика этой пурги
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39244206
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быдло___кодер,

Вам хватит вью.

Код: plsql
1.
SELECT t.*, count(*) over(partition by v1) as v2 FROM t
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39280561
Апну ка я свою старую тему.
Собственно в первом же ответе была дана правильная подсказка
что то у меня совсем моск засох

Код триггера, если вдруг кто-то столкнется с такой же задачей

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create or replace trigger ttt1
  for update or insert /*of v1*/ on T
  compound trigger
  flag boolean := false;

  before each row is
  begin
    if :new.v1 || 'x' <> :old.v1 || 'x' then
      flag := true;
    end if;
  end before each row;

  after statement is
  begin
    if flag then
      update t
      set    t.v2 =
             (select count(*)
              from   t t1
              where  t1.v1 = t.v1);
    end if;
  end after statement;

end ttt1;



Проверяем

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SQL> insert into t values(1, 1);
1 row inserted

SQL> insert into t values(1, 1);
1 row inserted

SQL> select * from t;
                                     V1                                      V2
--------------------------------------- ---------------------------------------
                                      1                                       2
                                      1                                       2

SQL> insert into t values(2,null);
1 row inserted

SQL> select * from t;
                                     V1                                      V2
--------------------------------------- ---------------------------------------
                                      1                                       2
                                      1                                       2
                                      2                                       1

SQL> update t set v1=0;
3 rows updated

SQL> select * from t;
                                     V1                                      V2
--------------------------------------- ---------------------------------------
                                      0                                       3
                                      0                                       3
                                      0                                       3
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39280656
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быдло___кодерПроверяем


А теперь проверь свой быдлoкод:

Сессия 1:

insert into t(v1) values(1);

Сессия 2:

insert into t(v1) values(1);

Сессия 1:

commit;

Сессия 2:

commit;


И получишь две строки с v1=1 и v2=1.

SY.
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39280784
Да, для многопользовательского режима такое не катит :(
Как впрочем и решение с пакетными переменными
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39280786
Собственно как и любое другое решение поскольку нет грязных чтений
...
Рейтинг: 0 / 0
Обход мутирования таблицы
    #39281333
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Быдло___кодерСобственно как и любое другое решение поскольку нет грязных чтений

Решение конечно есть - называется сериализация но вот подается это блюдо только как часть комплесного обеда вкупе с "вкусностями" типа locks, deadlocks, limited or no scalability и.т.д, и.т.п.

SY.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обход мутирования таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]