Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 autonomous_transaction  [new]
dveans
Member

Откуда:
Сообщений: 17
Привет, не могу понять почему не работает.

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;


create or replace procedure actuarialnewversion_delete  is
pragma autonomous_transaction;
begin
delete from inspolreport  t ;
commit;
end actuarialnewversion_delete;


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;


Если выполнить
eprlogin_second;
  pkg_lisa_policy.applynewversion(insurancepolicyid,idd_,null);


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

После этого вставляем в
pkg_reports.insurancepolicy_fconstructor(idd_ );
actuarialnewversion_insert(idd_ );


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

Но вот всё вместе почему-то не работает, autocommit выключен
30 июл 18, 10:39    [21613564]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
123йй
Member

Откуда:
Сообщений: 1638
dveans,

а чем отличается от этого ?
30 июл 18, 10:58    [21613648]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
-2-
Member

Откуда:
Сообщений: 15330
dveans
не работает
Почитай про уровни изоляции и не используй автономки. Они здесь не нужны.
30 июл 18, 11:00    [21613654]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
dveans
Member

Откуда:
Сообщений: 17
123йй,

тогда я проверил, вроде работало, потом заметил, что удаленее не работает и написал через транзакцию его, но в итоге вся процедура перестала работать
30 июл 18, 11:24    [21613739]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
dveans
Member

Откуда:
Сообщений: 17
-2-,

почитаю, спасибо
30 июл 18, 11:25    [21613743]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
dveans
Member

Откуда:
Сообщений: 17
-2-,

почитал и к сожалению не понял как можно правильно это применить для моего случая
30 июл 18, 15:34    [21615225]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
brzl
Member

Откуда: Москва
Сообщений: 146
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;  

-----------------------------------------------
Result:
from aut =0
from block =1
30 июл 18, 16:50    [21615583]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
IMNO
Member

Откуда:
Сообщений: 135
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 .
30 июл 18, 19:38    [21616104]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
dveans
Member

Откуда:
Сообщений: 17
IMNO,

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

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

Вот как можно сделать откат applynewversion??
31 июл 18, 09:47    [21616699]     Ответить | Цитировать Сообщить модератору
 Re: autonomous_transaction  [new]
dveans
Member

Откуда:
Сообщений: 17
Спасибо тем кто пытался помочь, я сделал
1 авг 18, 17:44    [21622010]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить