powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
25 сообщений из 143, страница 4 из 6
Функция length
    #39356875
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевПросто это не считается за dirty reads.
Кем не считается и почему?

ORA__SQLРезультат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра.
Именно в этом варианте, на мой взгляд, нельзя было бы говорить о dirty reads, поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр).
...
Рейтинг: 0 / 0
Функция length
    #39356909
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousORA__SQLРезультат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра.Именно в этом варианте, на мой взгляд, нельзя было бы говорить о dirty reads, поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр).Так и нет же никакой разницы передать через параметр или сделать fetch.
Фаза fetch вообще оторвана от транзакции и всего остального. Просто вычитывается ранее сохраненный результат.
Что собственно и верно. Иначе была полная неразбериха.
Из-за open-fetch вся путаница. Сделать через for cur in (select * from) loop end loop; не получится.
Так что за уши притянутый случай. dirty reads нет и быть не может.
А вот то, что autonomous_transaction начинается с BEGIN - важный нюанс раскопали.
...
Рейтинг: 0 / 0
Функция length
    #39356911
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLОткрыли в одной (зафиксировали результат на некоторый scn), тянуть данные пытаемся позже, в другой транзакции.
Ну и чем это отличается от чтения в транзакции A и отправки результатов в транзакцию B xthtp dbms_pipe. Ну или совсем простом случае - передачи информации из row level триггера автономно работающей процедуре, которая сохранит их в журнал.
Ни чем. И в том и в другом случае нарушение изоляции. Осознанное и управляемое.
Главное, чтоб сам курсор не запутался в том, данные какой транзакции он читает.
...
Рейтинг: 0 / 0
Функция length
    #39356921
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр).
А здесь ты передаешь данные через переменную. Очень гигантская разница.

SQL машина работает в одной транзакции и передает данные в PL/SQL, работающий в другой.
Никто из них dirty reads не делает. Межтранзакционное взаимодействие есть, оно нарушает ACID.

P.S. Хочешь dirty reads - делай дамп блока и парси ручками. Такой механизм в Oracle есть :)
...
Рейтинг: 0 / 0
Функция length
    #39356951
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевandrey_anonymous поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр).
А здесь ты передаешь данные через переменную. Очень гигантская разница.
Вообще-то разница существенная.
Для переданных извне данных никто нигде не гарантировал корректность.
Поэтому разработчики обычно проверяют переданные извне параметры.

Чуть более дискуссионный вопрос - о заранее открытом глобальном курсоре.
Адекватный разработчик понимает, что данные в этом курсоре могут быть не консистентны с состоянием базы, в котором работает его транзакция - т.е. он может столкнуться с феноменами нарушения изоляции, в т.ч. с dirty reads, phantom reads.
И называет эти явления своими именами , а не "не считается".

Ну и собственно для меня тема диспута - не в dirty как таковых (предсказуемо, управляемо, может быть полезно), а в том, что разработчик, написавший ( на основании документации ) код вида:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
function init_rc return sys_refcursor is ...
end;

procedure ... is
pragma autonomous_transaction;
  rc sys_refcursor := init_rc();
begin
  fetch rc ...
  ...
end;


вообще говоря , вправе ожидать, что курсор откроется в контексте автономной транзакции.
Но ввиду недокументированного поведения (судя по ноте - documentation bug) может не просто попасть на неприятности, но и обнаружить их на очень-очень позднем этапе.
И хорошо еще, если автономка используется для целей логирования.
Как-то так.
...
Рейтинг: 0 / 0
Функция length
    #39356998
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousнаписавший ( на основании документации ) код вида:
Код: plsql
1.
2.
  pragma autonomous_transaction;
  rc sys_refcursor := init_rc();

вообще говоря, вправе ожидать, что курсор откроется в контексте автономной транзакции.А если такой:
Код: plsql
1.
2.
  rc sys_refcursor := init_rc();
  pragma autonomous_transaction;

Его ожидания имеют права отличаться?
...
Рейтинг: 0 / 0
Функция length
    #39357012
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicА если такой:
Код: plsql
1.
2.
  rc sys_refcursor := init_rc();
  pragma autonomous_transaction;

Его ожидания имеют права отличаться?
Почитаем доку вместе?
https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm AUTONOMOUS_TRANSACTION Pragma
...
PRAGMA

Signifies that the statement is a pragma (compiler directive). Pragmas are processed at compile time, not at run time . They pass information to the compiler.

Usage Notes

You can apply this pragma to:

Top-level (not nested) anonymous PL/SQL blocks
Local, standalone, and packaged functions and procedures
Methods of a SQL object type
Database triggers

Таким образом имеем:
- прагма работает в момент компиляции
- применяется к pl/sql unit-у целиком.

Следствие: нет оснований ожидать различий в поведении успешно скомпилированного кода в зависимости от положения pragma autonomous_transaction.
...
Рейтинг: 0 / 0
Функция length
    #39357019
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot andrey_anonymous]ElicА если такой:[/src] https://docs.oracle.com/cd/B19306_01/appdev.102/b14261/autonotransaction_pragma.htm AUTONOMOUS_TRANSACTION Pragma
...
PRAGMA
В доке по 12с немного переформулировали, но суть не поменялась:
https://docs.oracle.com/database/121/LNPLS/autotransaction_pragma.htm#LNPLS01302 The AUTONOMOUS_TRANSACTION pragma marks a routine as autonomous ; that is, independent of the main transaction.

In this context, a routine is one of these:

Schema-level (not nested) anonymous PL/SQL block
Standalone, package, or nested subprogram
Method of an ADT
Noncompound trigger
...
Рейтинг: 0 / 0
Функция length
    #39357042
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Но там в принципе и словесное описание картинки:

Entering and Exiting

When you enter the executable section of an autonomous routine, the main transaction suspends. When you exit the routine, the main transaction resumes.

И по поводу executable section:

A PL/SQL block is defined by the keywords DECLARE, BEGIN, EXCEPTION, and END. These keywords divide the block into a declarative part, an executable part, and an exception-handling part. Only the executable part is required. A block can have a label.

Example 1-1 shows the basic structure of a PL/SQL block. For syntax details, see "Block".

Example 1-1 PL/SQL Block Structure

<< label >> (optional)
DECLARE -- Declarative part (optional)
-- Declarations of local types, variables, & subprograms

BEGIN -- Executable part (required)
-- Statements (which can use items declared in declarative part)

[EXCEPTION -- Exception-handling part (optional)
-- Exception handlers for exceptions (errors) raised in executable part]
END;


Вроде, как бы документировано, не?

Regards

Maxim
...
Рейтинг: 0 / 0
Функция length
    #39357063
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim Demenkoandrey_anonymous,
Но там в принципе и словесное описание картинки:
Entering and Exiting
When you enter the executable section of an autonomous routine, the main transaction suspends. When you exit the routine, the main transaction resumes.

Здесь задокументировано лишь то, что "main transaction suspends".
Прямого указания на то, что declare выполняется именно в контексте main transaction, нет.
А это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous".
...
Рейтинг: 0 / 0
Функция length
    #39357065
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевПочитав ветку нашел "вопрос для собеседования".
Предсказать результат запроса:
Код: plsql
1.
2.
3.
4.
with t as (select level id from dual connect by level<10)
select * from (
select cast((collect(id) over (order by id desc)) as sys.odcinumberlist) from t
) where rownum=1


так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен


если убрять where rownum=1, у Вас работает?

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39357066
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousА это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous".Тебе не надоело бессмысленно спорить?
...
Рейтинг: 0 / 0
Функция length
    #39357089
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandrey_anonymousА это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous".Тебе не надоело бессмысленно спорить?
Не бессмысленно.
Я в ходе дискуссии я полностью определился в своем отношении к обсуждаемому явлению (autonomous declare).
До ссылки на нотку это был забавный недокументированный побочный эффект с непонятным будущим, после ссылки на нотку я склонился к версии о баге в документации.
А в целом - мне кажется, что тема полностью раскрыта.
Всем спасибо за участие, особенно Elicу и Владимиру Любомудрову за любезно предоставленные ссылки и квалифицированное оппонирование.
...
Рейтинг: 0 / 0
Функция length
    #39357114
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousСергей Арсеньевпропущено...

А здесь ты передаешь данные через переменную. Очень гигантская разница.
Вообще-то разница существенная.
Для переданных извне данных никто нигде не гарантировал корректность.

И тут ты передаешь извне через переменную к которой есть общий доступ.
То, что эта переменная позволяет дергать SQL машину в другой транзакции вполне ожидаемое поведение. Но это не означает, что происходит грязное чтение - происходит именно межтранзакционное взаимодействие. Заданное (хотя возможно и неожиданно) программистом.
...
Рейтинг: 0 / 0
Функция length
    #39357116
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..если убрять where rownum=1, у Вас работает?
Поработает, поработает и прибивает серверный процесс... :)
...
Рейтинг: 0 / 0
Функция length
    #39357117
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен
Это то пол беды, у меня результат - массив с одним элементом, а не с 9, как в случае без order by (который не падает).
...
Рейтинг: 0 / 0
Функция length
    #39357121
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
with t as (select level id from dual connect by level<10)
select * from (
select cast((collect(id) over (partition by mod(id,2))) as sys.odcinumberlist) from t
) where rownum=1;

with t as (select level id from dual connect by level<10)
select * from (
select cast((collect(id) over (partition by mod(id,2) order by id desc)) as sys.odcinumberlist) from t
) where rownum=1;



sqlplusCAST((COLLECT(ID)OVER(PARTITIONBYMOD(ID,2)))ASSYS.ODCINUMBERLIST)
--------------------------------------------------------------------------------
SYS.ODCINUMBERLIST(2,8,6,4)


CAST((COLLECT(ID)OVER(PARTITIONBYMOD(ID,2)ORDERBYIDDESC))ASSYS.ODCINUMBERLIST)
--------------------------------------------------------------------------------
SYS.ODCINUMBERLIST(8)
...
Рейтинг: 0 / 0
Функция length
    #39357126
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевstax..так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен
Это то пол беды, у меня результат - массив с одним элементом, а не с 9, как в случае без order by (который не падает).Не стоит баловаться с возможностями, которых по документации быть не должно, и к тому же делать какие-то выводы касательно функционала на основании этого.
dbms_photoshopenv,

Ага, надо было пойти еще дальше и поспрашивать
1) как collect работает с over (), хотя по доке она может быть только агрегатной
2) особенности работы ora_hash с произвольными типами включая UDF, хотя по доке во многих случаях она по доке не должна работать
3) как работает reverse на многобайтовых кодировках, хотя в доке ее вообще нет
4) детали работы полезной функции sys_op_map_nonnull
5) как вставить дату с 13-м месяцем и прочие важные детали...
...
Рейтинг: 0 / 0
Функция length
    #39357129
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopНе стоит баловаться с возможностями,
В работе не стоит использовать, а баловаться то почему нельзя?

P.S. Фиг с ней с агрегативностью, rownum то почему пробрасывается, хотя план запроса говорит об оратном? Или это тоже документированное поведение?
...
Рейтинг: 0 / 0
Функция length
    #39357134
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ни у кого 12 под рукой нет? Что он возвращает?
...
Рейтинг: 0 / 0
Функция length
    #39357139
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousdbms_photoshopandrey_anonymous,

Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :))
Гм... а я бы рассказал... есть вариантик на автономке...
Короче, я бы однозначно провалил собеседование на девелопера Как уже многие заметили, особенности работы с передаваемыми реф курсорами в качестве параметров в автономки даже с натяжкой сложно трактовать как грязные чтения.

Я с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :)
...
Рейтинг: 0 / 0
Функция length
    #39357141
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

Срегей, еще раз. Collect - агрегатная функция. И в 12с тоже.
...
Рейтинг: 0 / 0
Функция length
    #39357143
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЯ с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :)
А вот это уже чистой воды грязные чтения. :)

P.S. Понятно, что тоже не документировано, но поменяли ли поведение?
...
Рейтинг: 0 / 0
Функция length
    #39357149
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевdbms_photoshopЯ с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :)
А вот это уже чистой воды грязные чтения. :)

P.S. Понятно, что тоже не документировано, но поменяли ли поведение?Чего менять-то? Ивент сделать недоступным? :))
...
Рейтинг: 0 / 0
Функция length
    #39357152
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевdbms_photoshopНе стоит баловаться с возможностями,
В работе не стоит использовать, а баловаться то почему нельзя?

P.S. Фиг с ней с агрегативностью, rownum то почему пробрасывается, хотя план запроса говорит об оратном? Или это тоже документированное поведение?Имелось в виду, что с выводами от баловста надо быть осторожным.

Очевидно что rownum не должно срабатывать до аналитики.
Интересные моменты по этому поводу были тут Объясните поведение аналитической функции .

Я таки предпринял попытку кратко описать механизм срабатывания "разных частей запроса".
Когда уважаемые ревьюверы заревьювят - опубликую.
...
Рейтинг: 0 / 0
25 сообщений из 143, страница 4 из 6
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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