powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложнейшая тема по Oracle
16 сообщений из 16, страница 1 из 1
Сложнейшая тема по Oracle
    #32098746
new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Такой вопрос:
Я работаю с таблицей, вношу в нее измения, срабатывает триггер к примеру на вставку делает определенный расче и сохраняет данные в другой таблице
(при этом срабатывает процедура с Автономной транзакцией)

Далее я делаю rollback и таблица (в которую я вносил изменения) откатывается в начальное состояние

Вопрос, можно ли отлавить данны откат, чтобы провести перерасчет в таблице, в которой данные были сохранены процедурой с автономн. транзакц.
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098759
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Убери автономную транзакцию, зачем она тебе в данном случае?
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098763
new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да дело в том что таблица, в которую сносятся результаты перед тем как заполняется полностью очищается, и может это происходить одновременно
из нескольких мест, если ее убрать то таблица заблакируется и остальные будут ждать коммита.
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098772
Les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
квест софтвера был вопрос как отловить коммит. Возьми идею которая там описывается и сделай аналогично. Это весьма хитроумный способ, порадуешся
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098773
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, тут надо что-то придумать с конфигурацией всей систему. Большая эта таблица расчетов? Может быть стоит завести еще одну временную, таблицу, куда складывать расчет, а потом, непосредственно перед commit'ом, вносить изменения в "боевую" таблицу расчетов. Кстати, если ты ее очищаешь через truncate table, то всяко откатиться не сможешь. Когда-то у меня бродила мысть использовать alter table exchange partition для разруливания таких ситуаций.

В общем, ИМХО, следует поразмыслить над построением системы.
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098784
new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
о я где почерпнуть эту драгоценную информацию
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098794
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какую именно?
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098819
new one
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Инфу, что бы отслеживать коммиты и ролбеки
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098832
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИМХО не найдешь. По крайней мере, нет таких System Event'ов, позволяющий отслеживать commit или rollback.
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098865
Les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098914
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты "ИМХО" сверху заметил? Если же знаешь как- поделись, мне, к примеру, интересно было бы.
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098922
Les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если вкратце, то ты помнишь что у нас есть триггер на ошибки в БД.
Ты делаешь какой то сигнальный флажок, то есть табличку с констрейном.
и перед началом операции записываешь туда неправильные данные.
После того как ты все сделал, флажок снимаешь.
А если флажок не снял, то при попытке коммита у тебя пойдет ругань,
коммит не пройдет, а ругань ты сможешь отловить на триггере с ошибками.
Эта идея была когда идет вставка с анализируемым порядком и т.д.
Он ее реализовал, и нечто похожее я видел на форуме квест софтваре

Теперь к нашим баранам. Я не проверял, и возможно ошибаюсь
Мы начали что то делать. вставил данные в таблицу А. А теперь беру и вставляю данные в сигнальную табличку Б. А из автономной транзакции
мой констрайн позволяет при налии данных в Б записать данные в сигнальную табличку С.
Потом идет бла-бла-бла
И вот я делаю роллбэк. Возможно у нас пойдет ругань на нарушение констрэйна? И мы сможем ее отловить и сделать то что нужно?
В общем тут дело за экспирементом. А форум идет на адресе
http://www.quest-pipelines.com/pipelines/plsql/tips.htm
или где то там. Напиши потом на емель, если получится?
С уважением, Алексей les21@mail.ru
PS
Без обид *-)
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098941
Les
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не увидит измененных данных вызвавшей ее сессии
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32098957
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откровенно говоря, метод с сигнальными таблицами мне показался несколько запутанным. Потом, если ты вставил в своей сессии данные, то вроде как из автономной транзакции до commit'а ты из не увидишь, на то она и автономная. Далее, ИМХО существует вероятность заблокировать самого себя, если попытаться вставить даные с некую таблицу, апотом в автономной транзакции вставить данные в нее же или связанную с ней по ссылочной целостности .

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

1. Изменять данные только через процедуру.
2. Свои расчеты производим в отдельную таблицу, по структуре одинаковую с основной, после всех изменений. Ее можно создавать как global temporary table.
3. В конце всего чистим таблицу расчетов и вставляем данные из нашей временной таблицы. При наличии Oracle Enterprise Edition это можно сделать похитрее:
- Есть еще одна таблица с одной партицией, по структуре одинакова с таблицей расчетов.
- Обмениваемся этой партицией с таблицей расчетов (теперь она пустая).
- Вставляем данные из временной таблицы.
- Commit. При возникновении exception'а обмениваемся партицией взад, возвращая все на свои места.

Такая вот вкраце идея.
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32099105
Alexandr Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А триггер на событие AUDIT
за системной привилегией FORCE TRANSACTION?
P.S. Об исходном вопросе темы - неужели нельзя по-другому кандовее
задачу решить?
...
Рейтинг: 0 / 0
Сложнейшая тема по Oracle
    #32099141
ShgGena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vobschem ideya dostatocho standartnaya i reshenie toge.
-- sozdaetsya paket-hraniliche rezultata do zaversheniya
osnovnoy tranzakcii
-- pered nachalom dannie ochischautsya
-- dlya kagdoy stroki osnovnoy tranzakcii pereraschet
ukladyvaetsya v bufer
-- po zavershenii osnovnoy tranzakcii zapicivautsya rezultaty
pererascheta.

Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
create or replace package abc is
  type r_calc is record (....);
  type t_calc is table of r_calc index by binary_integer;

  tt t_calc;

  procedure recalculate(..) ;
  procedure write_final_data;
  procedure start_trn ;
end;
/


create or replace package body abc is
 i pls_integer;

 procedure start_trn is
 begin
   tt.delete;
   i :=  0 ;
 end;
 procedure recalculate(..) is
 begin
    -- all needed calculations
 
   i := i +  1 ;
   tt(i).xxx := ...;
   ...
 end;

  procedure write_final_data is
   j pls_integer;
  begin
   for j in  1 ..i loop
      --
 
      -- write calculation into result table
 
      --
 
     insert / update ... from tt(j);
     ...
    end loop;
  end;
end;
/


 --
 
 -- before statment trigger
 
 --
 
create or replace trigger bs_stmt
before insert on tabl
begin
 abc.start.trn;
end;
/

 --
 
 -- for each rows
 
 --
 
create or replace trigger ber_stmt
before insert on tabl
for each rows
begin
  abc.recalculate(..);
  ..
end;
/

 --
 
 -- after statment trigger
 
 --
 
create or replace trigger as_stmt
before insert on tabl
begin
 abc.write_final_data;
end;
/

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


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