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

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

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

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

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

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

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

Такая вот вкраце идея.
...
Рейтинг: 0 / 0
30.01.2003, 19:06
    #32099105
Alexandr Plus
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложнейшая тема по Oracle
А триггер на событие AUDIT
за системной привилегией FORCE TRANSACTION?
P.S. Об исходном вопросе темы - неужели нельзя по-другому кандовее
задачу решить?
...
Рейтинг: 0 / 0
30.01.2003, 20:26
    #32099141
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сложнейшая тема по Oracle
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Сложнейшая тема по Oracle / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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