powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
15 сообщений из 15, страница 1 из 1
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39557397
Splash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет.

Можно ли передавать текущую копию данных с помощью ref курсора между различными транзакциями в PL/SQL?

Тест работает:

Код: 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.
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.
create table ref_cur_tx_test (data varchar2(100), numb number(20));
create table ref_cur_tx_test_log (src varchar2(10), datetime timestamp, data varchar2(100), numb number(20));


create or replace package body pkg_ref_cur_tx_test is

procedure log_it1 is
  pragma autonomous_transaction;
begin
  insert into ref_cur_tx_test_log (src, datetime, data, numb)
  select 'log1', systimestamp, data, numb from ref_cur_tx_test;
  commit;
end;

procedure log_trick(p_rc in sys_refcursor) is
  pragma autonomous_transaction;
  rec ref_cur_tx_test%rowtype;
begin
  loop
    fetch p_rc into rec;
    exit when p_rc%notfound;
    insert into ref_cur_tx_test_log (src, datetime, data, numb)
    values ('log2', systimestamp, rec.data, rec.numb);
  end loop;
  commit;
end;

procedure log_it2 is
  rc sys_refcursor;
begin
  open rc for select * from ref_cur_tx_test;
  log_trick(rc);
  close rc;
end;

procedure run is
begin
  execute immediate 'truncate table ref_cur_tx_test';

  for i in 1..10 loop
    insert into ref_cur_tx_test(data, numb) values (dbms_random.string('L', 20), dbms_random.value(1,100500));
  end loop;
  
  log_it1;
  log_it2;
 
  commit;
end;

END;
/

create or replace package pkg_ref_cur_tx_test is
  procedure run;
end pkg_ref_cur_tx_test;
/


begin
  pkg_ref_cur_tx_test.run;
end;
/

select * from ref_cur_tx_test;
select * from ref_cur_tx_test_log where src!='log2'; -- results are not here
select * from ref_cur_tx_test_log; -- results are here

drop table ref_cur_tx_test purge;
drop table ref_cur_tx_test_log purge;
drop package pkg_ref_cur_tx_test;
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39557419
Splash,

Курсор можно даже передавать на клиента, который совсем не транзакционная СУБД.
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39557442
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SplashМожно ли передавать текущую копию данных с помощью ref курсора между различными транзакциямиМожно
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39557863
Splash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но при этом в другом коде с таким же подходом каким-то чудом выскакивает ошибка ORA-08103: object no longer exists. Никто ничего не truncate и не rebuild, оно само.
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39557876
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SplashНо при этом в другом коде с таким же подходом каким-то чудом выскакивает ошибка ORA-08103: object no longer exists. Никто ничего не truncate и не rebuild, оно само.Немного про чудеса 13239188 .
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39557890
Splash
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо тебе, мил человек!

Код: plsql
1.
create global temporary table ref_cur_tx_test (data varchar2(100), numb number(20));


Меняю в исходном тестовом примере одну строчку на создание временной таблицы -- и всё, привет "ORA-08103: object no longer exists".

И это при том, что commit идёт опосля... Oracle ни в какую не даёт чужой транзакции подглядывать данные во временной таблице.
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39558666
ElicSplashМожно ли передавать текущую копию данных с помощью ref курсора между различными транзакциямиМожно

обоснуй RTFM-ом

По ИМХО шной логике
сие должно нарушать концептуальную констистентность , и вызывать
циклические дедлок рестарты на for update курсорах.
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39558669
мастеркласс техносрача сие должно нарушать концептуальную констистентностькурсоры - клиентская прерогатива. plsql тоже клиент. Приложение получило в переменную данные, использовало в другой транзакци. Если исходная транзакция не завершена, заблокированные строки недоступны для изменения. Передача контекста транзакции другой сессии это совсем другой механизм - dbms_XA.

мастеркласс техносрачавызывать
циклические дедлок рестарты на for update курсорах.for update лочит в той транзакции, в которой открыт курсор. К самому курсору блокировка строк отношения не имеет. Можешь хоть на бумажке переписать данные, полученные с for update - тоже своего рода курсор. Дедлок с передачей или непередачей значений между транзакциями не связан.
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39558725
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мастеркласс техносрачаПо ИМХО шной логике
сие должно нарушать концептуальную констистентность , и вызывать
циклические дедлок рестарты на for update курсорах.Речь не про них.
19941227
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39559078
Elicмастеркласс техносрачаПо ИМХО шной логике
сие должно нарушать концептуальную констистентность , и вызывать
циклические дедлок рестарты на for update курсорах.Речь не про них.
19941227

Если не про них, тогда речь о грязном чтении,
когда в транзакцию вбрасыватся данные по левому SCN.
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39559090
б.анальщинамастеркласс техносрача сие должно нарушать концептуальную констистентностькурсоры - клиентская прерогатива. plsql тоже клиент. Приложение получило в переменную данные, использовало в другой транзакци. Если исходная транзакция не завершена, заблокированные строки недоступны для изменения. Передача контекста транзакции другой сессии это совсем другой механизм - dbms_XA.

мастеркласс техносрачавызывать
циклические дедлок рестарты на for update курсорах.for update лочит в той транзакции, в которой открыт курсор. К самому курсору блокировка строк отношения не имеет. Можешь хоть на бумажке переписать данные, полученные с for update - тоже своего рода курсор. Дедлок с передачей или непередачей значений между транзакциями не связан.

Читайте внимательно сабж.

"между транзакциями"

Это банальное грязное чтение,
есть такой уровень изолированности транзакций ,
но Оракл машет маркетинговым флагом , что он вреден
не нужен и не поддерживается ,

а тут бац и такая банальная нетривиальщина :)
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39559094
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
мастеркласс техносрачатогда речь о грязном чтенииСчитать что угодно не возбранишь.
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39559294
Elicмастеркласс техносрачатогда речь о грязном чтенииСчитать что угодно не возбранишь.


Вопрос стоял не что угодно, а между транзакциями

;)
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39559364
мастеркласс техносрача между транзакциями Почему именно курсор с for update? В одной транзакции получил незакомиченное значение 42, передал в другую - это нарушение консистентности. Запретить что-либо передавать и получать в транзакциях!
...
Рейтинг: 0 / 0
Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
    #39559366
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если посмотреть на код приведенный автором, у него банальный логинг в автономной транзакции

Какая к российской матери консистентность?
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Можно ли использовать ref cursor для передачи данных между транзакциями в PL/SQL?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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