Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Обход мутирования таблицы / 11 сообщений из 11, страница 1 из 1
26.05.2016, 14:41:16
    #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
26.05.2016, 14:57:47
    #39244117
on update of column
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход мутирования таблицы
> как предотвратить рекурсивный вызов
Проверкой на изменяемое поле?
...
Рейтинг: 0 / 0
26.05.2016, 14:58:07
    #39244118
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход мутирования таблицы
Быдло___кодеркак предотвратить рекурсивный вызов, выполняя запрос в after statement

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

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

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

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

Код: plsql
1.
SELECT t.*, count(*) over(partition by v1) as v2 FROM t
...
Рейтинг: 0 / 0
26.07.2016, 17:41:59
    #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
26.07.2016, 20:26:38
    #39280656
SY
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
27.07.2016, 08:45:18
    #39280784
Обход мутирования таблицы
Да, для многопользовательского режима такое не катит :(
Как впрочем и решение с пакетными переменными
...
Рейтинг: 0 / 0
27.07.2016, 08:47:22
    #39280786
Обход мутирования таблицы
Собственно как и любое другое решение поскольку нет грязных чтений
...
Рейтинг: 0 / 0
27.07.2016, 15:50:34
    #39281333
SY
SY
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Обход мутирования таблицы
Быдло___кодерСобственно как и любое другое решение поскольку нет грязных чтений

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

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


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