Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / autonomous_transaction / 10 сообщений из 10, страница 1 из 1
30.07.2018, 10:39
    #39680899
dveans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
Привет, не могу понять почему не работает.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace procedure actuarialnewversion(insurancepolicyid in number) is
  idd_ number;
begin
  
  actuarialnewversion_delete;
  eprlogin_second;
  pkg_reports.applynewversion(insurancepolicyid,idd_,null);
  pkg_reports.insurancepolicy_fconstructor(idd_);
  actuarialnewversion_insert(idd_);
  rollback;

end actuarialnewversion;



Код: plsql
1.
2.
3.
4.
5.
6.
create or replace procedure actuarialnewversion_delete  is
pragma autonomous_transaction;
begin
delete from inspolreport  t ;
commit;
end actuarialnewversion_delete;



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create or replace procedure actuarialnewversion_insert ( newinsurer number) is

pragma autonomous_transaction;
begin
  

for rex in (select r.* from inspolreport_session r where r.insurancepolicyid = newinsurer )
loop
  insert into  inspolreport  (y1,redempamount1,redempamount2,reducamount1,reducamount2,insurancepolicyid) values(rex.y1,rex.redempamount1,rex.redempamount2,rex.reducamount1,rex.reducamount2,rex.insurancepolicyid);
end loop;
commit;
end actuarialnewversion_insert;



Если выполнить
Код: plsql
1.
2.
eprlogin_second;
  pkg_lisa_policy.applynewversion(insurancepolicyid,idd_,null);



Получаем значение idd_

После этого вставляем в
Код: plsql
1.
2.
pkg_reports.insurancepolicy_fconstructor(idd_ );
actuarialnewversion_insert(idd_ );



То нужные данные получаем.

Но вот всё вместе почему-то не работает, autocommit выключен
...
Рейтинг: 0 / 0
30.07.2018, 10:58
    #39680916
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
dveans,

а чем отличается от этого ?
...
Рейтинг: 0 / 0
30.07.2018, 11:00
    #39680918
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
dveansне работаетПочитай про уровни изоляции и не используй автономки. Они здесь не нужны.
...
Рейтинг: 0 / 0
30.07.2018, 11:24
    #39680935
dveans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
123йй,

тогда я проверил, вроде работало, потом заметил, что удаленее не работает и написал через транзакцию его, но в итоге вся процедура перестала работать
...
Рейтинг: 0 / 0
30.07.2018, 11:25
    #39680936
dveans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
-2-,

почитаю, спасибо
...
Рейтинг: 0 / 0
30.07.2018, 15:34
    #39681138
dveans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
-2-,

почитал и к сожалению не понял как можно правильно это применить для моего случая
...
Рейтинг: 0 / 0
30.07.2018, 16:50
    #39681190
brzl
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
Код: 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.
create table dropme_t (id number(1));
/
declare
    l_tmp number;
    
    procedure aut is
    pragma autonomous_transaction;
    l_cnt number;
    begin
    
        select count(1) into l_cnt from dropme_t;
        dbms_output.put_line('from aut = ' ||l_cnt);
    end;

begin

    insert into dropme_t (id)
    values(1);
    
    aut;
    
    select count(1) into l_tmp from dropme_t;
    dbms_output.put_line('from block = ' ||l_tmp);
    
    rollback;

end;    
/

drop table dropme_t;  


Код: plsql
1.
2.
3.
4.
-----------------------------------------------
Result:
from aut =0
from block =1
...
Рейтинг: 0 / 0
30.07.2018, 19:38
    #39681272
IMNO
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
dveans , автономная транзакция это фактически другая сессия.

Результаты DML двух сессий не видны друг другу до commit.

Что Вы делаете:
1. Запускается сессия 1, где вызывается процедура actuarialnewversion.
2. В другой сессии Вы чистите таблицу inspolreport. Делаете commit.
3. В 1 сессии пытаетесь выбрать данные процедурой applynewversion, но Вы только что их удалили в другой сессии. Поэтому естественно, что ничего не выбирается.
4. Тут что-то происходит(тело процедуры insurancepolicy_fconstructor Вы не предоставили, поэтому не знаю, что она делает)
5. Во 2 сессии вставляете данные в цикле. Делаете commit.
6. Делаете rollback, который в Вашей примере совсем ничего не делает. Потому что rollback работает в рамках сессии 1.
Все удаления/вставки Вы делали во 2 сессии, соответственно rollback из 1 сессии никак на них не влияет.

В итоге в таблице inspolreport будут данные, вставленные процедурой actuarialnewversion_insert .
...
Рейтинг: 0 / 0
31.07.2018, 09:47
    #39681413
dveans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
IMNO,

Немного не так, как Вы написали.

1.Вызывается процедура actuarialnewversion.
2. Удаляются данные с таблицы inspolreport.
3. В applynewversion нет выборки данных с inspolreport, здесь получаем новый idd_(в этой процедуре никаких commit нет).
4. Вставляем новый idd_ в insurancepolicy_fconstructor и заполняем сессионную таблицу inspolreport_session.
5. Вставляем данные с inspolreport_session в inspolreport.

Вот как можно сделать откат applynewversion??
...
Рейтинг: 0 / 0
01.08.2018, 17:44
    #39682161
dveans
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
autonomous_transaction
Спасибо тем кто пытался помочь, я сделал
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / autonomous_transaction / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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