powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Функция length
143 сообщений из 143, показаны все 6 страниц
Функция length
    #39351151
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пупсики, бывает ли случай, когда функция length возвращает значение 0 (ноль)?
...
Рейтинг: 0 / 0
Функция length
    #39351153
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary DenisПупсики, бывает ли случай, когда функция length возвращает значение 0 (ноль)?
Бывает
...
Рейтинг: 0 / 0
Функция length
    #39351155
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexFF__|, не подскажешь, в каких случаях?
...
Рейтинг: 0 / 0
Функция length
    #39351158
Фотография AlexFF__|
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary DenisAlexFF__|, не подскажешь, в каких случаях?
LOB локатор
...
Рейтинг: 0 / 0
Функция length
    #39351159
Maxim Demenko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary Denis,

Код: plsql
1.
length(empty_clob())



Regards

Maxim
...
Рейтинг: 0 / 0
Функция length
    #39351160
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А то был на собеседовании, не сообразил что ответить.
...
Рейтинг: 0 / 0
Функция length
    #39351172
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот это мне вообще мозг сломало
Код: 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.
select
    lnnvl(dummy = 'X'),
    lnnvl(dummy = 'Y')
from dual
where lnnvl(dummy = 'Y');

LNNVL(DUMMY='X') LNNVL(DUMMY='Y')
---------------- ----------------


1 строка выбрана.


План выполнения
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(LNNVL("DUMMY"='Y'))

Note
-----
   - automatic DOP: Computed Degree of Parallelism is 1 because of parallel threshold
...
Рейтинг: 0 / 0
Функция length
    #39351212
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary DenisА вот это мне вообще мозг сломало

Код: plsql
1.
2.
3.
4.
5.
select
    lnnvl(dummy = 'X'),
    lnnvl(dummy = 'Y')
from dual
where lnnvl(dummy = 'Y');




Насчет LNNVL , так это та привыкай к курению доки. Сначала не затягиваясь, а затем глядишь и во вкус войдешь. Хотя тут Oracle сам себе мозг сломал. LNNVL возвращает BOOLEAN от которого у SQL несварение и дока вобщем-то и говорит (правда can а не must) "LNNVL provides a concise way to evaluate a condition when one or both operands of the condition may be null. The function can be used in the WHERE clause of a query, or as the WHEN condition in a searched CASE expression ". Однако SQL хавает LNNVL но толком переварить не может. SQL преобразует тип результатa LNNVL в NUMBER а вот TRUE/FALSE не в 1/0 как хотелось бы, a в NULL.

Код: 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.
SQL> create or replace
  2    view v1
  3      as
  4        select  lnnvl(dummy = 'X') x,
  5                lnnvl(dummy = 'Y') y
  6          from  dual
  7  /

View created.

SQL> select  *
  2    from  v1
  3  /

         X          Y
---------- ----------


SQL> desc v1
 Name                                      Null?    Type
 ----------------------------------------- -------- --------
 X                                                  NUMBER
 Y                                                  NUMBER

SQL> 



SY.
...
Рейтинг: 0 / 0
Функция length
    #39351241
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я только не пойму зачем надо было делать LOGICAL NON-NULL VALUE? Зачем NON?
Разве не проще было сделать проверку предиката с учетом пустых значений? Ну или хотя бы в дополнение..
...
Рейтинг: 0 / 0
Функция length
    #39351258
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Я только не пойму зачем надо было делать LOGICAL NON-NULL VALUE? Зачем NON?Ее сделали для внутреннего употребления, вылезала в эксплейне на not in или что-то вроде того. Потом, видимо кто-то задействовал в в applications и решили опубликовать.
...
Рейтинг: 0 / 0
Функция length
    #39351333
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 -2-,
автор вылезала в эксплейне
вылезала обычно тогда, когда возникает concatenation в плане
2 --Eugene--
авторЗачем NON?
вот как раз за этим.
lnnvl на второй ветке должен отсечь все то, что уже попало в первую, не уничтожая то, из второй, что не попало в первую ветку.

во первых, если lnnvl допустит для какой-то строки null и ее не было в первой части образуемого union,
то эта строка будет просто потеряна. Не имеет права lnnvl давать null - он мир разрушит при дакой способности.

Во вторых, без правильного lnnvl правильный concatenation, работающий как union all, без дополнительного distict,
получить нельзя.
...
Рейтинг: 0 / 0
Функция length
    #39351341
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

получить нельзя - в смысле затруднительно автоматически получить из текста конкретного запроса.
Там где можно и оптимизатор обучен это делать, он сделает это не используя lnnvl
...
Рейтинг: 0 / 0
Функция length
    #39351346
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,

да моё возмущение не про это.
оно про то, что ради проверки предиката с учетом пустых значений приходится логически менять предикат на обратный.
ie: [a is not null or b is not null or a = b] == [lnnvl(a != b)]
...
Рейтинг: 0 / 0
Функция length
    #39351365
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

во первых, вы ошибаетесь
[lnnvl(a != b)] = (a = b OR a Is Null OR b Is Null)
во вторых, на обратное логическое значение во второй части юниона
меняется именно потому, что прямое сработало в первой.
Только оно должно быть специальное обратное, такое, которое преобразует false в true,
а unknown тоже в true.

PS
Если возмущает - презирай его.
Это правильно в том отношении, что ошибок от непонимания, что творишь - не наделаешь.
...
Рейтинг: 0 / 0
Функция length
    #39351398
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--,

прошу прощения, запечатался..
конечно же IS NULL
...
Рейтинг: 0 / 0
Функция length
    #39353877
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пупсики, вопрос с того же собеседования. Попросили перечислить предикаты, в плане данного запроса:

Код: plsql
1.
2.
3.
4.
5.
select *
from dual
where lnnvl(dummy = 'Y')
and   nullif(dummy, 'Y') = 'S'
and   decode(dummy, 'X', 'S') = 'S';



Я опять облажался. Назвал только 2 из 3х. Сказали, что такой разработчик им не подходит.


Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
План выполнения
----------------------------------------------------------
Plan hash value: 272002086

--------------------------------------------------------------------------
| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |
--------------------------------------------------------------------------
|   0 | SELECT STATEMENT  |      |     1 |     2 |     2   (0)| 00:00:01 |
|*  1 |  TABLE ACCESS FULL| DUAL |     1 |     2 |     2   (0)| 00:00:01 |
--------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter(
             DECODE("DUMMY",'X','S')='S' AND 
             CASE "DUMMY" WHEN 'Y'  THEN NULL ELSE "DUMMY" END ='S' AND 
             LNNVL("DUMMY"='Y')
             )


...
Рейтинг: 0 / 0
Функция length
    #39353903
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по вопросам, в этой конторе специализируются на выборках из dual
...
Рейтинг: 0 / 0
Функция length
    #39354026
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предикатов:
0 - так как в документации предикат упоминается в контексте джоина, который здесь отсутствует.
1 - так как в глоссарии "where condition".
1 - так как в википедии предикат определяется как функция, возвращающая логический результат
...
6 - так как в википедии предикат определяется как функция, возвращающая логический результат, но за функцию также считаем операции (см. sys.standard).
...
Рейтинг: 0 / 0
Функция length
    #39354037
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Функция length
    #39354040
Жость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andrey_anonymous http://mathhelpplanet.com/static.php?p=logika-predikatov Дочитал до середины, потом умер
...
Рейтинг: 0 / 0
Функция length
    #39354046
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жостьandrey_anonymous http://mathhelpplanet.com/static.php?p=logika-predikatov Дочитал до середины, потом умер
Тем не менее, если рассматривать предикат в математическом смысле - как предложение, превращающееся в истинное или ложное утверждение при подстановке конкретных элементов множества, то предикатов будет ровно три:
Код: plsql
1.
2.
3.
1. lnnvl(dummy = 'Y')
2. nullif(dummy, 'Y') = 'S'
3. decode(dummy, 'X', 'S') = 'S'


которые на представленном множестве M из одного элемента 'X' превращаются в утверждения:
Код: plsql
1.
2.
3.
1. lnnvl('X' = 'Y') => 'X' <> 'Y' - истинно
2. nullif('X', 'Y') = 'S'  => 'X' = 'S' - ложно
3. decode('X', 'X', 'S') = 'S' => 'S' = 'S' - истинно


При этом на множестве M предикаты 1 и 3 - равносильны и тождественно истинны, а предикат 2 - тождественно ложен.
:)
...
Рейтинг: 0 / 0
Функция length
    #39354109
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousпредикатов будет ровно три:
Код: plsql
1.
2.
3.
1. lnnvl(dummy = 'Y')
2. nullif(dummy, 'Y') = 'S'
3. decode(dummy, 'X', 'S') = 'S'

А как же предикат, определенный на множестве предикатов?
Четыре!
...
Рейтинг: 0 / 0
Функция length
    #39354114
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-А как же предикат, определенный на множестве предикатов?
Четыре!
Не верю :)
...
Рейтинг: 0 / 0
Функция length
    #39354161
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-...
0 - так как ....
1 - так как ...
1 - так как ...
...
6 - так как в википедии предикат определяется как функция, возвращающая логический результат, но за функцию также считаем операции (см. sys.standard).

я бы сказал 1, но их здесь не меньше пяти и не больше 21, с разумным ожиданием в районе 9,
так так конкретно здесь 1 это 3(атома) и 2(двухместных символа),
Итак:
- предикат здесь один - фильтрующий - исходный - он же единственный один:
AND(AND(lnnvl(dummy = 'Y'),nullif(dummy, 'Y') = 'S'),decode(dummy, 'X', 'S') )

, но
- состоящий из трех предикатных атомов и двух двухместных предикатных символов AND
- на которых образуются следующие предикаты

исходный - он же единственный один:
AND(AND(lnnvl(dummy = 'Y'),nullif(dummy, 'Y') = 'S'),decode(dummy, 'X', 'S') )

считаем предикаты:
1й lnnvl(dummy = 'Y') - A - атом
2й nullif(dummy, 'Y') = 'S' - B - атом
3й decode(dummy, 'X', 'S') = 'S' - C - атом
4й AND(lnnvl(dummy = 'Y'),nullif(dummy, 'Y') = 'S')
5й AND(lnnvl(dummy = 'Y'), decode(dummy, 'X', 'S') = 'S')
6й AND(nullif(dummy, 'Y') = 'S', decode(dummy, 'X', 'S') = 'S'
------
4й, 5й и 6й коммутативны и атомы могут быть переставлены (+3)
------
7й AND(AND(lnnvl(dummy = 'Y'),nullif(dummy, 'Y') = 'S'),decode(dummy, 'X', 'S') = 'S')
7й дает базовую конструкцию исследуемого фильтрующего предиката - AND(AND(A,B),C)
в зависимости от деталей
(ну, количества принятых на грудь перед собеседованием грамм, например)
в этом месте ставится точка или продолжается:
8)- AND(AND(C,A),B)
9) AND(AND(B,C),A)
7й, 8й и 9й - каждый - может быть записан 4мя способами (3*4=12) + 6+3 = 21
...
Рейтинг: 0 / 0
Функция length
    #39354207
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary DenisА то был на собеседовании, не сообразил что ответить.

Какую только хренотень ораклисты у других ораклистов ни спрашивают...

Я бы и не додумался спрашивать про какую-то функцию, про которую можно
прочитать в документации...
...
Рейтинг: 0 / 0
Функция length
    #39354436
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivКакую только хренотень ораклисты у других ораклистов ни спрашивают...
Да, черт возьми! Но вопрос усугубляется тем, что в доке нет упоминания о том, как эта функция работает с empty lob-локаторами. Есть только https://docs.oracle.com/cd/E11882_01/server.112/e41084/functions088.htm#SQLRF00658 char can be any of the data types CHAR, VARCHAR2, NCHAR, NVARCHAR2, CLOB, or NCLOB.
...
Рейтинг: 0 / 0
Функция length
    #39354469
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary DenisНо вопрос усугубляется тем, что в доке нет упоминания о том, как эта функция работает с empty lob-локаторами.Есть: RTFM Nulls in SQL Functions (FAQ)
...
Рейтинг: 0 / 0
Функция length
    #39354489
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

Друк, прочитал статью, ссылку на которую ты дал.
Nulls in SQL FunctionsMost scalar functions return null when given a null argument. You can use the NVL function to return a value when a null occurs. For example, the expression NVL(commission_pct,0) returns 0 if commission_pct is null or the value of commission_pct if it is not null.Note:When you apply SQL functions to LOB columns, Oracle Database creates temporary LOBs during SQL and PL/SQL processing. You should ensure that temporary tablespace quota is sufficient for storing these temporary LOBs for your application.Не понял, что ты хотел этим сказать. Ты считаешь, что из этих двух предпосылок можно было бы совершенно однозначно сделать вывод, что length вернет 0 для empty-clob-ов?

Да и вообще, в контексте этого примера не понимаю второе утверждение.
Код: 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.
create table elic(id number, c clob);

Таблица создана.

Затрач.время: 00:00:00.07

insert into elic values (1, null);

1 строка создана.

Затрач.время: 00:00:00.01
insert into elic values (2, empty_clob());

1 строка создана.

Затрач.время: 00:00:00.00
insert into elic values (3, 'Hello Elic!');

1 строка создана.

Затрач.время: 00:00:00.00

commit;

Фиксация обновлений завершена.

Затрач.время: 00:00:00.01

column c format a30
select id, c, length(c) from elic;

        ID C                               LENGTH(C)
---------- ------------------------------ ----------
         1
         2                                         0
         3 Hello Elic!                            11

Затрач.время: 00:00:00.04
...
Рейтинг: 0 / 0
Функция length
    #39354545
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary DenisДрук"Коверканье"
Lary DenisNulls in SQL FunctionsMost scalar functions return null when given a null argument.из этих двух предпосылок можно было бы совершенно однозначно сделать вывод, что length вернет 0 для empty-clob-ов?
...
Рейтинг: 0 / 0
Функция length
    #39354555
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

И все-таки
цитируя докуMost scalar functions return null when given a null argument.не тождественно нижеследующему:
All scalar functions return non-null when given a non-null argument.
...
Рейтинг: 0 / 0
Функция length
    #39354571
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyя бы сказалОзнакомься с книгой Введение в математическую логику
Ну это если, конечно, не хочется быть шутом... мало ли какие цели ты преследуешь.
...
Рейтинг: 0 / 0
Функция length
    #39354575
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lary Denis,

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

Возможно, у них legacy решение построенное на использовании lnnvl, знаний о length(empty_clob()) и других "хорошо" документированных возможностях СУБД.
...
Рейтинг: 0 / 0
Функция length
    #39354609
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env,

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

Уровни изоляции - критически важное базовое понятие, кооторое должен знать каждый разработчки БД.
Я почти всегда спрашиваю.
Другое дело, что в основном отвечает менее чем 1 из 5... ну это уже другая проблема.
Это даже не затрагивая вопросы согласованности вызова PL/SQL из SQL, рестарты и прочие тонкости.
...
Рейтинг: 0 / 0
Функция length
    #39354745
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--Eugene--Про уровни изоляции не спрашивали, не?Нет, вопросы, которые я озвучил - были первыми. Сказали раз этого не знаю, то не стоит вести дальнейшую беседу.
...
Рейтинг: 0 / 0
Функция length
    #39354995
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopУровни изоляции - критически важное базовое понятие, кооторое должен знать каждый разработчки БД.
А вот возьму и не соглашусь :)
Важное - да.
Критически - нет.
Мне вот до сих пор не доводилось в пром. решениях видеть применение уровней изоляции, отличных от RC - видимо, просто не повезло.
И большинство разрабов прекрасно с этим живут, а ежели вдруг возникнет реальная потребность в serializable или даже в RO - то сеньор подскажет.
...
Рейтинг: 0 / 0
Функция length
    #39355046
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousdbms_photoshopУровни изоляции - критически важное базовое понятие, кооторое должен знать каждый разработчки БД.
А вот возьму и не соглашусь :)
Важное - да.
Критически - нет.
Мне вот до сих пор не доводилось в пром. решениях видеть применение уровней изоляции, отличных от RC - видимо, просто не повезло.
И большинство разрабов прекрасно с этим живут, а ежели вдруг возникнет реальная потребность в serializable или даже в RO - то сеньор подскажет.
странно
я пользовал
set transaction read only;
для отчетов с несколькими селектами

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39355056
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousdbms_photoshopУровни изоляции - критически важное базовое понятие, кооторое должен знать каждый разработчки БД.
А вот возьму и не соглашусь :)
Важное - да.
Критически - нет.
Мне вот до сих пор не доводилось в пром. решениях видеть применение уровней изоляции, отличных от RC - видимо, просто не повезло.
И большинство разрабов прекрасно с этим живут, а ежели вдруг возникнет реальная потребность в serializable или даже в RO - то сеньор подскажет.Дело не только в приминении. Дело в понимании деталей реализации.
Даже Кайт начинает свою книгу с главы "Разработка успешных приложения для Oracle" где описываются исключительная важность понимания подобных моментов.
Потом идет отдельная глава про транзакции.

Для практических задач.
Это прежде всего понимание насколько серьезно отличаются решение одинаковых задач для разных СУБД.
Например, задача ограничения числа строк в Oracle и MSSQL.
Задачка
Setting Limits with Triggers
Без этого понимания появляются команды супер java/c#/etc архитекторов, которые колбасят ORM не масштабируемые "универсальные " решения и воспринимают СУБД как черный ящик.
Один раз был я на интервью в подобной конторе, у них все уже начинало дико тупить при увеличении нагрузки, но они были категорически против изменения дизайна и ожидали от нанимаемого специалиста по СУБД, что он "что-то подкрутит" и все начнет летать.

Был у меня интересный случай, много лет назад пригласили меня посмотреть на одну систему.
В биллинге один процесс постоянно лил данные в табличку, другой процесс из нее переливал и агрегировал, а затем транкейтил.
Все что, было записано в источник после старта insert select group by и до его окончания не подхватывалось самим стейтментом и бесследно удалялось.
Тогда еще у большинства были не безлимит пакеты и более 10% использованного трафика терялось.
На столько же меньше была прибыль конторы за интернет.
Систему писали бывшие спецы по MSSQL и им не приходило в голову, что данные залитые после начала стейтмента не будут увидены. Потом там все было переписано.

Критически или не критически, пусть каждый останется при своем.
Мне не очень хотелось бы работать с кодерами, которые этих вещей хотя бы для одной СУБД не понимают.

Кстати, при интервью возникают курьезные ситуации, часто человек, осознавая, что технически не тянет начинает вещать, что он был "high level architect", а кодерством занимались другие.
Ну или фантазии про грязные чтения и фантомы в Оракле иногда тоже очень впечатляют.
...
Рейтинг: 0 / 0
Функция length
    #39355061
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopandrey_anonymousА вот возьму и не соглашусь :)
Важное - да.
Критически - нет.
Дело не только в приминении. Дело в понимании деталей реализации.
Вот-вот.
Спрашиваете людей про "уровни изоляции", а услышать хотите совсем про другое, судя по "примерам из жизни" :)

Только вчера обсуждали с коллегой, какие темы обсудить с разработчиками (есть у нас что-то вроде "факультатива" для заинтересованных).
Как раз предлагалось обсудить "уровни изоляции".
Но мне удалось убедить коллегу, что обсуждать надо не "уровни изоляции", а "data concurrency and consistency".
И вот эта тема - критически важна.
Это и механизмы consistent gets, и блокировки (включая itl и пользовательские), и 1555 и многое-многое другое, даже "уровни изоляции" как маленький параграф.
Сюда же совершенно логично цепляются ретроспективные запросы, которые непосредственно с "уровнями изоляции" вообще не состыкуются, хотя по сути - еще одно проявление "деталей реализации".
...
Рейтинг: 0 / 0
Функция length
    #39355082
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Спрашивая я ожидаю лишь услышать про видимость закомиченных изменений в соседней сессии на начало стейтмента или транзакции в зависимости от RC или S соответственно.
Да, уровни изоляции это лишь "маленький параграф" из области "многопользовательский доступ".
...
Рейтинг: 0 / 0
Функция length
    #39355089
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopСпрашивая я ожидаю лишь услышать про видимость закомиченных изменений в соседней сессии на начало стейтмента или транзакции в зависимости от RC или S соответственно.

...и именно это Знание я полагаю не критически важным, особенно на собеседовании - разработчик может быть вполне квалифицированным, но неиспользуемое Знание про уровни изоляции, отличные от RC, могло легко и непринужденно выветриться за годы практики :)
Вообще собеседование - штука специфическая.
Не так уж давно сам сел в лужу на вопросе "а как shared pool помогает оптимизировать запросы?", потому как мне shared pool в этом процессе никогда никак не помогал...
...
Рейтинг: 0 / 0
Функция length
    #39355105
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,

Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :))
...
Рейтинг: 0 / 0
Функция length
    #39355117
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopandrey_anonymous,

Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :))
Гм... а я бы рассказал... есть вариантик на автономке...
Короче, я бы однозначно провалил собеседование на девелопера
...
Рейтинг: 0 / 0
Функция length
    #39355133
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousdbms_photoshopandrey_anonymous,
Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :))
Гм... а я бы рассказал... есть вариантик на автономке...
Код: 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.
create table ane_tdirt as select cast('Committed rec' as varchar2(100)) a from dual;
 
Table created

declare
  rc sys_refcursor;
  cursor c is select * from ane_tdirt;
 
  procedure print_dirt is
    pragma autonomous_transaction;
    lv varchar2(20);
  begin
    dbms_output.put_line('RC reads:');
    for i in c loop
      dbms_output.put_line(i.a);
    end loop;
 
    dbms_output.new_line;
    dbms_output.put_line('Dirty reads:');
    loop
      fetch rc into lv;
     exit when rc%notfound;
      dbms_output.put_line(lv);
    end loop;
    close rc;
  end;
begin
  insert into ane_tdirt values('Uncommitted rec');
  open rc for select * from ane_tdirt;
  print_dirt;
  rollback;
end;
/
 
RC reads:
Committed rec
 
Dirty reads:
Committed rec
Uncommitted rec
 
PL/SQL procedure successfully completed

select * from ane_tdirt;
 
A
--------------------
Committed rec

drop table ane_tdirt purge;
 
Table dropped
 
SQL> 
...
Рейтинг: 0 / 0
Функция length
    #39355259
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous,


Хороший пример.
У него есть такая вариация (на базе твоего кода)
Код: 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.
create table ane_tdirt as select cast('Committed rec' as varchar2(100)) a from dual;
declare
--  rc sys_refcursor;
  cursor c is select * from ane_tdirt;

  function get_dirty_Not_automomous_csr return sys_refcursor
    is
     rc_inner sys_refcursor;
  Begin
      open rc_inner for select * from ane_tdirt;
      Return rc_inner;
  End;  
  
  procedure print_dirt is
    pragma autonomous_transaction;
    lv varchar2(20);
    rc_local sys_refcursor := get_dirty_Not_automomous_csr;
  begin
    dbms_output.put_line('RC reads:');
    for i in c loop
      dbms_output.put_line(i.a);
    end loop; 
 
    dbms_output.new_line;
    dbms_output.put_line('Dirty reads:');
    loop
      fetch rc_local into lv;
      exit when rc_local%notfound;
      dbms_output.put_line(lv);
    end loop;
    close rc_local;
  end;
begin
  insert into ane_tdirt values('Uncommitted rec');
-- здесь чисто, "глобальных" курсоров нет
--  open rc for select * from ane_tdirt;
  print_dirt;
  rollback;
end;
/
drop table ane_tdirt purge;

...
Рейтинг: 0 / 0
Функция length
    #39355276
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
прошу извинить за дублирование, но так, имхо, выразительнее:
Код: 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.
create table ane_tdirt as select cast('Committed rec' as varchar2(100)) a from dual;
declare
--  rc sys_refcursor;
  cursor c is select * from ane_tdirt;
  ---  
  procedure print_dirt is
    pragma autonomous_transaction; -- Это прагма, она здесь есть.
    -- предварительная декларация
    function get_dirty_Not_automomous_csr return sys_refcursor;
    
    lv varchar2(20);
    rc_local sys_refcursor := get_dirty_Not_automomous_csr;
    
    -- реализация
    function get_dirty_Not_automomous_csr return sys_refcursor
      is
       rc_inner sys_refcursor;
    Begin
        open rc_inner for select * from ane_tdirt;
        Return rc_inner;
    End;      
  begin
    dbms_output.put_line('RC reads:');
    for i in c loop
      dbms_output.put_line(i.a);
    end loop; 
 
    dbms_output.new_line;
    dbms_output.put_line('Dirty reads:');
    loop
      fetch rc_local into lv;
      exit when rc_local%notfound;
      dbms_output.put_line(lv);
    end loop;
    close rc_local;
  end;
begin
  insert into ane_tdirt values('Uncommitted rec');
-- здесь чисто, "глобальных" курсоров нет
--  open rc for select * from ane_tdirt;
  print_dirt;
  rollback;
end;
/
drop table ane_tdirt purge;

...
Рейтинг: 0 / 0
Функция length
    #39355319
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyтак, имхо, выразительнее:

Уберем ref и добавим перца:
Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
create table ane_tdirt as select cast('Committed rec' as varchar2(100)) a from dual;
 
Table created
declare
 
  cursor c is select * from ane_tdirt;
 
  procedure print_dirt is
    pragma autonomous_transaction;
 
    function init return varchar2;
 
    cursor c_inner is select * from ane_tdirt;
    lv varchar2(20) := init();
 
    function init return varchar2 is begin
      insert into ane_tdirt values ('Autonomous init');
--      commit;
      open c_inner;
      return null;
    end;
  begin
 
    dbms_output.put_line('Expected dirty reads (cursor opened in main transaction):');
    loop
      fetch c into lv;
     exit when c%notfound;
      dbms_output.put_line(lv);
    end loop;
    close c;
 
    dbms_output.new_line;
 
    dbms_output.put_line('Unexpected dirty reads (cursor opened in autonomous DECLARE):');
    loop
      fetch c_inner into lv;
     exit when c_inner%notfound;
      dbms_output.put_line(lv);
    end loop;
    close c_inner;
 
    dbms_output.new_line;
 
    dbms_output.put_line('RC reads Autonomous transacton RC reads:');
    for i in c loop
      dbms_output.put_line(i.a);
    end loop;
  end;
begin
  insert into ane_tdirt values('Uncommitted rec');
  open c;
  print_dirt;
 
  dbms_output.new_line;
  dbms_output.put_line('Main transaction:');
  for i in c loop
    dbms_output.put_line(i.a);
  end loop;
 
  rollback;
end;
/
 
Expected dirty reads (cursor opened in main transaction):
Committed rec
Uncommitted rec
 
Unexpected dirty reads (cursor opened in autonomous DECLARE):
Committed rec
Uncommitted rec
Autonomous init
 
RC reads Autonomous transacton RC reads:
Committed rec
 
Main transaction:
Committed rec
Uncommitted rec
Autonomous init
 
PL/SQL procedure successfully completed

select * from ane_tdirt;
 
A
--------------------
Committed rec

drop table ane_tdirt purge;
 
Table dropped
 
SQL> 


...
Рейтинг: 0 / 0
Функция length
    #39355537
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
'Unexpected dirty reads (cursor opened in autonomous DECLARE):'

Надо знать, где на самом деле начинается автономка: Entering and Exiting Autonomous Transactions
...
Рейтинг: 0 / 0
Функция length
    #39355547
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic
Код: plsql
1.
'Unexpected dirty reads (cursor opened in autonomous DECLARE):'

Надо знать, где на самом деле начинается автономка: Entering and Exiting Autonomous Transactions

На docs.oracle.com плиз ссылку, а не на квизы всякие :)

А dirty зря выделил - оно именно dirty для автономки, которая курсор читает.

Что до темы "где начинается", то все просто:
Код: 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.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
create sequence ane_tdirt_seq;
 
Sequence created

create table ane_tdirt( seq_no integer default ane_tdirt_seq.nextval
                      , call_path varchar2(1000)
                      , x_id varchar2(100)
                      , callstack varchar2(4000));
 
Table created

declare
  lv varchar2(100);
  function fix_context(i_tag varchar2) return varchar2 is
  begin
    insert into ane_tdirt(call_path, x_id, callstack) values (i_tag, dbms_transaction.local_transaction_id, dbms_utility.format_call_stack);
    return null;
  end;
 
  function autonomous_f(tag varchar2, d number default 1) return varchar2 is pragma autonomous_transaction;
    lv varchar2(100) := fix_context (tag||'->aDecl('||d||')');
    lz varchar2(100) := case when d>0 then autonomous_f(tag||'->aDecl('||d||')', d-1) end;
  begin
    --pragma inline(fix_context,'YES');
    lv := fix_context(tag||'->aBody('||d||')');
    if d > 0 then lv := autonomous_f(tag||'->aBody('||d||')', d-1); end if;
    commit;
    return null;
  end;
begin
  lv := fix_context('parent');
  lv := autonomous_f('parent');
  commit;
end;
/
 
PL/SQL procedure successfully completed
select * from ane_tdirt;
 
SEQ_NO CALL_PATH                      X_ID            CALLSTACK
------ ------------------------------ --------------- --------------------------------------------------------------------------------
     1 parent                         15.29.1165      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        21  anonymous block
 
     2 parent->aDecl(1)               15.29.1165      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        11  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     3 parent->aDecl(1)->aDecl(0)     15.29.1165      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        11  anonymous block
                                                      0x72676dd0        12  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     4 parent->aDecl(1)->aBody(0)     12.8.1175       ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        15  anonymous block
                                                      0x72676dd0        12  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     5 parent->aBody(1)               13.1.1221       ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        15  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     6 parent->aBody(1)->aDecl(0)     13.1.1221       ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        11  anonymous block
                                                      0x72676dd0        16  anonymous block
                                                      0x72676dd0        22  anonymous block
 
     7 parent->aBody(1)->aBody(0)     16.25.1215      ----- PL/SQL Call Stack -----
                                                        object      line  object
                                                        handle    number  name
                                                      0x7acc5a58         1  anonymous block
                                                      0x72676dd0         6  anonymous block
                                                      0x72676dd0        15  anonymous block
                                                      0x72676dd0        16  anonymous block
                                                      0x72676dd0        22  anonymous block
 
 
7 rows selected

drop table ane_tdirt purge;
 
Table dropped

drop sequence ane_tdirt_seq;
 
Sequence dropped

...
Рейтинг: 0 / 0
Функция length
    #39355558
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ...
andrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась.
andrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN, что ты ещё раз и показал.
...
Рейтинг: 0 / 0
Функция length
    #39355593
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ...
Не аргумент.
В доке есть про то, что автономная транзакция автономна.
И нет про то, что секция declare работает в контексте родительской транзакции.
Как минимум, это не очевидно.
Сталбыть, если "так задумано" - то должно было быть документировано.
А если не задумано - то это либо баг, либо багофича, т.е. поведение может измениться без предупреждения.
Как-то так.

Elicandrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась.
Не принимаю.
Во всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.
А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.

Elicandrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN
То ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно.
Я для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят.
И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge.
...
Рейтинг: 0 / 0
Функция length
    #39355634
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymous...
Во всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.
А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.
...

Мне бы не хотелось втягиваться в терминологические споры по поводу определения того, что такое "грязное" и "чистое", но, если уж вообще пользоваться такой терминологией,
то грязными я бы называл здесь записи именно внутри тела автономной процедуры порожденные.

Именно что курсор открыт до начала того бегина, который изолирует контекст вложенной, рекурсивной подтранзакции.
Значит, ему по документации, толкующей об изолированности автономной транзакции, положено не видеть записей, порождаемых после прохождения "точки изоляции", а он успешно видит их сплошь, по сути - в едином контексте.

То, что что точка изоляции проходит по бегину это одна история - про то, что в автономную транзакцию таки можно передавать информацию о состоянии порождающей транзакции.
Само по себе это спорный повод для утверждений про грязное чтение.

А то, что курсор, открытый до прохождения этой точки успешно видит происходящее после нее - другая, история про то, что для такого (открытого до границы начала рекурсивной транзакции) курсора контекст в действительности един.

Насчет поведение изменится в будущем.
Для того, чтобы на это рассчитывать, нужно ясное понимание того, что же в этой истории является очевидным багом.
Я вот не готов сказать, что он здесь есть и требует исправления.
Исправления, имхо, требует текст документации.
...
Рейтинг: 0 / 0
Функция length
    #39355692
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousИ нет про то, что секция declare работает в контексте родительской транзакции.
Как минимум, это не очевидно.Это да.
andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.Не важно, где он читается.
Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама.
andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов.
Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался.
andrey_anonymousТо ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно.Нет. Непросто, потому что начинается с BEGIN.
andrey_anonymousЯ для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят.
И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge.Мне эта тема не интересна в практическом плане: в нормальном коде у нормального разработчика подобная "неоднозначность" просто не должна возникать.
Да и, как можно заметить, информация предназначалась не совсем тебе.
...
Рейтинг: 0 / 0
Функция length
    #39355773
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicandrey_anonymousВо всех вариантах курсор ... Но читается - в автономке.Не важно, где он читается.
Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама.
andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов.
Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался.

Примени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов.
Тот факт, что фича давно известная, сути явления не меняет - Oracle допускает грязные чтения посредством передачи открытого курсора в автономную транзакцию.

На тему "не должна встречаться в коде нормального разработчика" - это как посмотреть.
В принципе, инициализация переменных в declare сама по себе не криминал.
Ты вот наткнулся когда-то на то, что в узкоспециальном случае секция declare автономной транзакции выполнится в контексте родительской, я - нет. И сколько разрабов еще не наткнулись - вопрос.
Несложно предположить, что кто-то инциализирует курсорные переменные в declare - с риском получить неконсистентные данные ввиду недокументированного поведения системы.
...
Рейтинг: 0 / 0
Функция length
    #39355857
andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки.
Открывается в контексте родительской - да.
Но читается - в автономке.
А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.этак ты договоришься, что в приложении один поток работает с одной транзакцией, другой с другой - грязное чтение.
Это не чтение грязное, а некорректная работа с транзакциями. А может и корректная, например для логирования.
...
Рейтинг: 0 / 0
Функция length
    #39355883
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грязная записьэтак ты договоришься
Эт вряд ли.
...
Рейтинг: 0 / 0
Функция length
    #39356062
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
грязная запись,

он прав. тут ведь "грязное" чтение имеется в виду не в морально-этическом смысле.
это просто такой термин.
...
Рейтинг: 0 / 0
Функция length
    #39356472
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousElicпропущено...
Надо знать, где на самом деле начинается автономка: Entering and Exiting Autonomous Transactions

На docs.oracle.com плиз ссылку, а не на квизы всякие :)
Oracle 8.1.5 and higher : Autonomous Transactions (Doc ID 65961.1)The parent (or main) transaction remains active while any
statements specified in the declare section of the autonomous unit
are executed.
...
Рейтинг: 0 / 0
Функция length
    #39356504
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, и стандартная дока в картинках показывает где именно замораживается родительская и стартует автономная транзакция
...
Рейтинг: 0 / 0
Функция length
    #39356516
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровOracle 8.1.5 and higher : Autonomous Transactions (Doc ID 65961.1)The parent (or main) transaction remains active while any
statements specified in the declare section of the autonomous unit
are executed.Спасибо.
...
Рейтинг: 0 / 0
Функция length
    #39356546
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНа docs.oracle.com плиз ссылку, а не на квизы всякие :)
Oracle 8.1.5 and higher : Autonomous Transactions (Doc ID 65961.1)The parent (or main) transaction remains active while any
statements specified in the declare section of the autonomous unit
are executed.[/quot]
Спасибо, Вячеслав.
Сталбыть, это documentation bug и можно не особо опасаться изменений в поведении.
...
Рейтинг: 0 / 0
Функция length
    #39356553
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Следующее сообщение еще не посмотрел?
...
Рейтинг: 0 / 0
Функция length
    #39356575
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousПримени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов.
А еслиб ты эти данные передал параметром (ну скажем в виде коллекции), то ты бы тоже называл это "грязным чтением"?
Просто Элик различает неявную передачу параметров, через declare и грязные чтения.
...
Рейтинг: 0 / 0
Функция length
    #39356584
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитав ветку нашел "вопрос для собеседования".
Предсказать результат запроса:
Код: 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
...
Рейтинг: 0 / 0
Функция length
    #39356587
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

для окончательного выноса мозга еще и
Код: plsql
1.
partition by mod(id,2)


добавить
...
Рейтинг: 0 / 0
Функция length
    #39356595
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровСледующее сообщение еще не посмотрел?
Посмотрел.
Не согласен, что тема освещена.
В ноте - да, в доке - нет.
...
Рейтинг: 0 / 0
Функция length
    #39356600
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевА еслиб
Сергей, если бы у бабушки был член - она была бы дедушкой.
В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов.
По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads.
Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать.
...
Рейтинг: 0 / 0
Функция length
    #39356619
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousСергей АрсеньевА еслиб
Сергей, если бы у бабушки был член - она была бы дедушкой.
В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов.
По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads.
Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать.А если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch?
Есть же, к примеру, ORA-08177 Can't serialize access for this transaction On index Block splits
...
Рейтинг: 0 / 0
Функция length
    #39356620
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousВячеслав ЛюбомудровСледующее сообщение еще не посмотрел?
Посмотрел.
Не согласен, что тема освещена.
В ноте - да, в доке - нет.На картинке какие-то непонятки?
...
Рейтинг: 0 / 0
Функция length
    #39356653
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ORA__SQLА если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch?
А он меняется?
Судя по тому, что возвращает - нет. Курсор работает в той транзакции, которая его создала.
Меняется только не совсем явное построение туннеля для передачи результата в новую транзакцию.
Механизм передачи данных из одной транзакции в другую в обход (в т.ч. в виде параметров, dbms_pipe и пр.) в любом случае нарушает изоляцию транзакций.
Просто это не считается за dirty reads. Вот если б этот курсор начал читать еще и назакомиченные данные вставленные в автономке - вот тогда был бы dirty reads.
...
Рейтинг: 0 / 0
Функция length
    #39356718
ORA__SQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Сергей Арсеньев]ORA__SQLА он меняется?
XID же другой. Запрещать или нет делать fetch при новом xid - это вопрос.
Сергей АрсеньевКурсор работает в той транзакции, которая его создала.У курсора есть два этапа: open и fetch.
Открыли в одной (зафиксировали результат на некоторый scn), тянуть данные пытаемся позже, в другой транзакции.
Результат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра.
А бы сделал такой вывод: не важно, когда и при каких условиях мы делаем fetch.
Фаза open всегда определяет содержимое курсора. При каких условиях открыли, то и получили.
...
Рейтинг: 0 / 0
Функция length
    #39356756
Фотография --Eugene--
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SANDBOX@ee>;create table t1 as select 1 a from dual;

Table created.

SANDBOX@ee>;var c refcursor;
SANDBOX@ee>;begin open :c for select * from t1; end;
  2  /

PL/SQL procedure successfully completed.

SANDBOX@ee>;drop table t1;

Table dropped.

SANDBOX@ee>;print c;
         A
----------
         1
...
Рейтинг: 0 / 0
Функция length
    #39356868
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровНа картинке какие-то непонятки?
На картинке в declare ничего транзакционного нет - сделать вывод о работе секции declare в контексте основной транзакции даже по отдельно взятой картинке очень сложно, а вместе с текстом - невозможно, поскольку в тексте заявлено, что прагма действует на pl/sql unit, а не на часть его.
...
Рейтинг: 0 / 0
Функция 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
Функция length
    #39357153
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopЧего менять-то?
Ну падение убрать, ненароком, я про агрегат оконный. :)
...
Рейтинг: 0 / 0
Функция length
    #39357157
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopОчевидно что rownum не должно срабатывать до аналитики.
Он вообще от другого запроса. :)
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (select level id from dual connect by level<10)
select * from (
select cast((collect(id) over
             (
              order by rownum desc
             )
            ) as sys.odcinumberlist
           ), rownum from t
)
where rownum=1
...
Рейтинг: 0 / 0
Функция length
    #39357158
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

ORA-03113 по прежнему отлично ловится, по крайней мере, на 12.1.0.2 на "аналитическом" collect (с сортировкой).
...
Рейтинг: 0 / 0
Функция length
    #39357161
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshop,

И элемент в коллекции, видать тоже 1
...
Рейтинг: 0 / 0
Функция length
    #39357162
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dbms_photoshopОчевидно что rownum не должно срабатывать до аналитики.Fixed.
...
Рейтинг: 0 / 0
Функция length
    #39357370
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andrey_anonymousElicпропущено...
Тебе не надоело бессмысленно спорить?
Не бессмысленно.
Я в ходе дискуссии я полностью определился в своем отношении к обсуждаемому явлению (autonomous declare).
До ссылки на нотку это был забавный недокументированный побочный эффект с непонятным будущим, после ссылки на нотку я склонился к версии о баге в документации.Да нет никакого бага
Картинка вполне доходчиво все показывает:

В сессии в текущий момент активной может быть только одна транзакция (V$SESSION.TADDR). Родительская транзакция замораживается по достижении (на картинке) слова BEGIN. На мой взгляд вполне естественно сделать вывод, что все что до этого выполняется в родительской транзакции.
Ну а приводимая уже цитата When you enter the executable section of an autonomous transaction, the main transaction suspendsс расшифровкой понятия "executable section" окончательно расставляет все по местам.
Считаю, что большего документация и разжевывать не должна. Хотя, конечно, можно "упереться рогом" и требовать дословного указания на все мелочи.

PS. Для меня это выглядело с самого начала вполне естественно. Скорее всего, по аналогии с обработчиком ошибок (ошибки в DECLARE обрабатываются обработчиком родительского блока)

andrey_anonymousВсем спасибо за участие, особенно Elicу и Владимиру Любомудрову за любезно предоставленные ссылки и квалифицированное оппонирование.
...
Рейтинг: 0 / 0
Функция length
    #39357392
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровPS. Для меня это выглядело с самого начала вполне естественно. Скорее всего, по аналогии с обработчиком ошибок (ошибки в DECLARE обрабатываются обработчиком родительского блока)Настало время задуматься, а какая транзакция может быть в EXCEPTION?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    if aDoCommit then
      commit;
      raise program_error;
    end if;
  exception
    when others then
      dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  a(true);
  a(false);
  dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
end;
/

...
Рейтинг: 0 / 0
Функция length
    #39357780
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
This function returns the local (to instance) unique identifier for the current transaction. It returns null if there is no current transaction.


почему m<- в null?

15 rollback; закрыл "мастер" транзакцию

procedure a откатает изменнения и в "мастер" транзакции


Код: 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.
  1  declare
  2     procedure a(aDoCommit boolean)
  3      is
  4        pragma autonomous_transaction;
  5      begin
  6        dbms_output.put_line('a-> '||dbms_transaction.local_transaction_id(true));
  7        if aDoCommit then
  8          commit;
  9          dbms_output.put_line('a->>'||dbms_transaction.local_transaction_id(true));
 10          raise program_error;
 11        end if;
 12      exception
 13        when others then
 14          dbms_output.put_line('a<- '||dbms_transaction.local_transaction_id(TRUE));
 15          rollback;
 16      end a;
 17    begin
 18      dbms_output.put_line('m-> '||dbms_transaction.local_transaction_id(true));
 19      a(true);
 20      dbms_output.put_line('m-= '||dbms_transaction.local_transaction_id(true));
 21      a(false);
 22      dbms_output.put_line('m<- '||dbms_transaction.local_transaction_id);
 23* end;
SQL> /
m-> 33.7.293338
a-> 4.20.2782176
a->>30.29.285147
a<- 30.29.285147
m-= 33.7.293338
a-> 17.16.2122395
a<- 33.7.293338
m<-

PL/SQL procedure successfully completed.



.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39357818
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..почему m<- в null?

15 rollback; закрыл "мастер" транзакцию

procedure a откатает изменнения и в "мастер" транзакцииСтанислав, ты то ли не владеешь знаками препинания, то ли разговариваешь сам с собой.
...
Рейтинг: 0 / 0
Функция length
    #39357879
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicstax..почему m<- в null?

15 rollback; закрыл "мастер" транзакцию

procedure a откатает изменнения и в "мастер" транзакцииСтанислав, ты то ли не владеешь знаками препинания, то ли разговариваешь сам с собой.

и то и другое
так луче/понятней?


[quot stax..]почему m<- в null?

15 rollback; закрыл "мастер" транзакцию .

procedure a откатает изменнения и в "мастер" транзакции .



.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358097
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic......Настало время задуматься
Да уж, зажигательный вариант истории, про то, почему никогда не пиши when others
...
Рейтинг: 0 / 0
Функция length
    #39358100
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyElic......Настало время задуматься
Да уж, зажигательный вариант истории, про то, почему никогда не пиши when others
Т.е. - ошибки программиста должны обнаруживать себя наиболее очевидным способом.
...
Рейтинг: 0 / 0
Функция length
    #39358133
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ElicВячеслав ЛюбомудровPS. Для меня это выглядело с самого начала вполне естественно. Скорее всего, по аналогии с обработчиком ошибок (ошибки в DECLARE обрабатываются обработчиком родительского блока)Настало время задуматься, а какая транзакция может быть в EXCEPTION?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    if aDoCommit then
      commit;
      raise program_error;
    end if;
  exception
    when others then
      dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  a(true);
  a(false);
  dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
end;
/

Таки ORA-6519 особый случай. Она должна обработаться в контексте родительской транзакции, поскольку выполнение автономной процедуры закончено. Более того перехватить ошибку и исправить положение уже и нельзя. Вообще в БД в рамках этой автономной транзакции сделать ничего нельзя ибо "the active autonomous transaction is implicitly rolled back and this error is raised".
С другой стороны, почему ошибка обрабатывается в обработчике автономной процедуры? Таки, наверное, контекст транзакции уже восстановлен, а обработчик исключительных ситуаций еще нет
И вот еще прикол
Код: 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.
tst> declare
  2    procedure a(aDoCommit boolean)
  3    is
  4      pragma autonomous_transaction;
  5    begin
  6  --
  7      for i in 1..3 loop
  8        begin
  9  --
 10          dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
 11          if aDoCommit then
 12            commit;
 13            raise program_error;
 14          end if;
 15  --
 16          return;
 17  --
 18        exception
 19          when others then
 20            dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id||' ORA'||sqlcode);
 21  --
 22        end;
 23      end loop;
 24  --
 25    end a;
 26  begin
 27    dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
 28    a(true);
 29    a(false);
 30    dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
 31  end;
 32  /
m->10.28.8270413
a->9.21.7985161
a<- ORA-6501
a->9.17.7985481
a<- ORA-6501
a->9.22.7986868
a<- ORA-6501
a->9.27.7984497
a<-10.28.8270413 ORA-6519
a->10.28.8270413
m<-10.28.8270413

PL/SQL procedure successfully completed.

...
Рейтинг: 0 / 0
Функция length
    #39358407
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровТаки ORA-6519 особый случай. Она должна обработаться в контексте родительской транзакции, поскольку выполнение автономной процедуры закончено. Более того перехватить ошибку и исправить положение уже и нельзя.
Забавно то, как раз не это. То, что блок exception на процедуру обрабатывается по выходу из нее с ошибкой это нормальное поведение. Как впрочем не лишено логики и обработка его, как если из нее не вышли. Вот то, что в зависимости от ситуации может быть то, а может быть другое, просто потому, что так проще, вот это забавно.
более того оптимизатор еще и отдает exception не тому блоку
Код: 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.
declare
      procedure a(aDoCommit boolean)
       is
         pragma autonomous_transaction;
         n varchar2(4000);
       begin
        begin
         dbms_output.put_line('a-> '||dbms_transaction.local_transaction_id(true));
         if aDoCommit then
           commit;
           dbms_output.put_line('a->>'||dbms_transaction.local_transaction_id(true));
           raise program_error;
         end if;
        exception
         when others then
           dbms_output.put_line('b<- '||dbms_transaction.local_transaction_id(TRUE));
           rollback;
        end;  
--         n:=dbms_transaction.local_transaction_id(TRUE);
       exception
         when others then
           dbms_output.put_line('a<- '||dbms_transaction.local_transaction_id(TRUE));
           rollback;
       end a;
     begin
       dbms_output.put_line('m-> '||dbms_transaction.local_transaction_id(true));
       a(true);
       dbms_output.put_line('m-= '||dbms_transaction.local_transaction_id(true));
       a(false);
       dbms_output.put_line('m<- '||dbms_transaction.local_transaction_id);
end;
/

...
Рейтинг: 0 / 0
Функция length
    #39358470
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyникогда не пиши when others then null end;
...
Рейтинг: 0 / 0
Функция length
    #39358476
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadboobyникогда не пиши when others then null end;
в данном случае свет гасит не команда Null - ты хоть весь бэктрейс туда запихни,
оно вообще не обязано быть замеченным, что где-то в извилинах массового процесса по дороге свет погас.
свет гасит именно сам when others
...
Рейтинг: 0 / 0
Функция length
    #39358490
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyAmKadпропущено...

в данном случае свет гасит не команда Null - ты хоть весь бэктрейс туда запихни,
оно вообще не обязано быть замеченным, что где-то в извилинах массового процесса по дороге свет погас.
свет гасит именно сам when others
ну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);


вполне допустимо.
...
Рейтинг: 0 / 0
Функция length
    #39358518
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);

Ну так ведь еще можно сделать и что-нибудь более осмысленное, например залоггировать ошибку и ее "окружение".
...
Рейтинг: 0 / 0
Функция length
    #39358544
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobyну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);


вполне допустимо.
Код: plsql
1.
when others then update emp set comm = 0 where job = 'Programmer'; commit;
...
Рейтинг: 0 / 0
Функция length
    #39358556
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровElicпропущено...
Настало время задуматься, а какая транзакция может быть в EXCEPTION?
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    if aDoCommit then
      commit;
      raise program_error;
    end if;
  exception
    when others then
      dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  a(true);
  a(false);
  dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
end;
/

Таки ORA-6519 особый случай. Она должна обработаться в контексте родительской транзакции, поскольку выполнение автономной процедуры закончено. Более того перехватить ошибку и исправить положение уже и нельзя. Вообще в БД в рамках этой автономной транзакции сделать ничего нельзя ибо "the active autonomous transaction is implicitly rolled back and this error is raised".
С другой стороны, почему ошибка обрабатывается в обработчике автономной процедуры? Таки, наверное, контекст транзакции уже восстановлен, а обработчик исключительных ситуаций еще нет
И вот еще прикол
Код: 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.
tst> declare
  2    procedure a(aDoCommit boolean)
  3    is
  4      pragma autonomous_transaction;
  5    begin
  6  --
  7      for i in 1..3 loop
  8        begin
  9  --
 10          dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
 11          if aDoCommit then
 12            commit;
 13            raise program_error;
 14          end if;
 15  --
 16          return;
 17  --
 18        exception
 19          when others then
 20            dbms_output.put_line('a<-'||dbms_transaction.local_transaction_id||' ORA'||sqlcode);
 21  --
 22        end;
 23      end loop;
 24  --
 25    end a;
 26  begin
 27    dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
 28    a(true);
 29    a(false);
 30    dbms_output.put_line('m<-'||dbms_transaction.local_transaction_id);
 31  end;
 32  /
m->10.28.8270413
a->9.21.7985161
a<- ORA-6501
a->9.17.7985481
a<- ORA-6501
a->9.22.7986868
a<- ORA-6501
a->9.27.7984497
a<-10.28.8270413 ORA-6519
a->10.28.8270413
m<-10.28.8270413

PL/SQL procedure successfully completed.





для меня неочевидным есть то
что в блоке exception (часть автономной процедуры) мы уже находимся в контексте основной транзакции

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358567
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-boobyну, что-то сорта
Код: plsql
1.
2.
3.
When Others 
  Then
  Raise_application_Error(iProgrammerError,'Ошибка программиста! Немедленно сообщите в службу поддержки',True);


вполне допустимо.
Код: plsql
1.
when others then update emp set comm = 0 where job = 'Programmer'; commit;



не страшно comm и так 0

а от то что закоммитет основную транзакцию, ето уже посерьезнее

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358569
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,
вот вот.
а если читать описание к ORA-6519, потом перечитывать и на досуге вдумываться, то ведь, там же все написано.
Здесь самое не очевидное, что написанному, оказывается, в данном случае, следует верить.
...
Рейтинг: 0 / 0
Функция length
    #39358574
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobystax..,
вот вот.
а если читать описание к ORA-6519, потом перечитывать и на досуге вдумываться, то ведь, там же все написано.
Здесь самое не очевидное, что написанному, оказывается, в данном случае, следует верить.

06519, 00000, "active autonomous transaction detected and rolled back"
// *Cause: Before returning from an autonomous PL/SQL block, all autonomous
// transactions started within the block must be completed (either
// committed or rolled back). If not, the active autonomous
// transaction is implicitly rolled back and this error is raised.
// *Action: Ensure that before returning from an autonomous PL/SQL block,
// any active autonomous transactions are explicitly committed
// or rolled back.
//-----------------------------------------------------------------------

откаталось и что, где сдесь что вернулись в контекст мастер транзакции?

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358608
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..откаталось и что, где сдесь что вернулись в контекст мастер транзакции?А куда ещё?
...
Рейтинг: 0 / 0
Функция length
    #39358637
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..// transaction is implicitly rolled back and this error is raised.

...

откаталось и что, где сдесь что вернулись в контекст мастер транзакции?

Откатились - значит транзакции нет.
Вообще блок exception по сути своей переходной. Из процедуры уже вышли, а к вызывающему еще не вернулись.

Вот где написано, что в моем варианте перехватит блок b.
...
Рейтинг: 0 / 0
Функция length
    #39358650
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

and здесь, неожиданно, следует читать, как союз определяющий последовательность действий.
Сначала происходит откат, потом выброс информации о том, что программист совершил ошибку.
Т.е. к моменту выброса такой ошибки, транзакции, подвергнутой rollback, уже нет.
нельзя уже оказаться в ее контексте и, тем более, вернуться в него.
...
Рейтинг: 0 / 0
Функция length
    #39358690
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elicstax..откаталось и что, где сдесь что вернулись в контекст мастер транзакции?А куда ещё?
как куда
остатся в автономке, в ексепшене может быть любой код, ето часть процедуры с autonomous_transaction


напр
exception
when ex6519 then
write_log();
commit;
...

rollback в теле процедуры не вываливает ж в мастер транзакцию

сделали implicitly rolled back , но зачем закрывать автономку,
причем implicitly rolled back делать если нет обработчика

почему для других исключений автономка не заканчивается?

имхо баг/фича

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358697
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевВообще блок exception по сути своей переходной. Из процедуры уже вышли, а к вызывающему еще не вернулись.

что значит из "процедуры уже вышли"
exception ето часть процедуры, и там может быть нехилый код

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358715
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobystax..,

and здесь, неожиданно, следует читать, как союз определяющий последовательность действий.
Сначала происходит откат, потом выброс информации о том, что программист совершил ошибку.
Т.е. к моменту выброса такой ошибки, транзакции, подвергнутой rollback, уже нет.
нельзя уже оказаться в ее контексте и, тем более, вернуться в него.
в ексепшене можно начать новую транзакцию изолированную от мастер

explicitly rolled back
откатывает текущие изменения
но не вываливает ж из автономки



Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
exception
  when zero_divide then
    rollback;
    ....
    --находимся в автономном контексте 
   ...
  when ex6519 then
    --implicitly rolled back 
    --находимся в контексте мастер транзакции

    ...



имхо
бага/фича

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358718
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

почему для других исключений автономка не заканчивается?

Потому что другие исключения гарантированно происходят до Return/End procedure_at

А про это исключение ты должен думать так:
Не веря в программиста, зная, что тот всегда пишет то, чего сам не понимает,
компилятор , в момент компиляции такой процедуры принудительно вставляет перед каждым return/End procedure вызов метода, производящего принудительные действия по откату с уведомлением в виде ошибки, если к этому моменту автономная транзакция еще не завершена.
...
Рейтинг: 0 / 0
Функция length
    #39358747
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
boobystax..,

почему для других исключений автономка не заканчивается?

Потому что другие исключения гарантированно происходят до Return/End procedure_at

А про это исключение ты должен думать так:
Не веря в программиста, зная, что тот всегда пишет то, чего сам не понимает,
компилятор , в момент компиляции такой процедуры принудительно вставляет перед каждым return/End procedure вызов метода, производящего принудительные действия по откату с уведомлением в виде ошибки, если к этому моменту автономная транзакция еще не завершена.

причем тут компилятор
если в коде есть обработчик исключения
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    procedure a(aDoCommit boolean)
      is
        pragma autonomous_transaction;
        ex6519 exception;
        pragma exception_init(ex6519,-6519);
...
      begin

      exception
--
        when ex6519 then
--- обработка
      end;
...




.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39358994
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

Ны хочешь rollback to savepoint, но там может быть только rollback, а он завершает текущую транзакцию.
На открыть новую, не связанную с мастер запрета нет.
И сделать ты это скорее обязан (собственными руками), раз уж ты решил, что тебе в этом месте необходимо явно перехватывать ошибку из категории "ошибка программиста".
каким нибудь Insert into your_super_log ты вполне достигнешь этой цели, но если эта, вновь открытая транзакция останется незавершенной при выходе из процедуры по нговому пути следования, то снова возникнет та же ошибка, которая уже не будет возвращать тебя в исходную точку твоего перехвата.
Компилятор здесь при том, что он знает синтакис, используемый в твоем исходном коде, умеет как забраковать его, объявив негодным к компиляции, так и преобразовать к виду, годному для исполнения.
В этом месте все тапки его.
А в данном случае, если работу по управлению подтранзакией не сделает компилятор, путем внесения в твой код вызовов, подразумеваемых наличием тобой написанной прагмы, то и сделать это будет некому, с учетом всех ожидаемых для данного варианта использования кода соглашений.
...
Рейтинг: 0 / 0
Функция length
    #39358995
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby,
сорри
НТы хочешь ...
...
Рейтинг: 0 / 0
Функция length
    #39359034
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевВот где написано, что в моем варианте перехватит блок b.А какой еще?
Именно в нем последний выполняемый оператор и именно из него происходит выход из процедуры (с незакрытой транзакцией, что и вызывает ORA-6519)

Хотя, конечно, выглядит это (да и наверняка, является) как баг.
Обработка ошибки, на мой взгляд, должна проводиться или за пределами автономной транзакции (конечно, концептуально это не очень красиво) или в новой автономной транзакции (на которую уже не генерить ошибку, чтоб не допустить рекурсии, что наверняка сложнее).
Т.е. либо крестик снимите, либо трусы оденьте.

А то, получается, из автономной транзакции, по определению являющейся отдельной от родительской, я тем не менее могу откатить или подтвердить родительскую транзакцию.
...
Рейтинг: 0 / 0
Функция length
    #39359036
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Речь, естественно, про обработку именно 6519

А то, что оно все-таки пытается после обработчика пойти выполнять PL/SQL дальше (до первого обращения к SQL или хрен знает какая там логика?) это вообще ни в какие ворота
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
tst> declare i number := 0;
  2    procedure atr as
  3       pragma autonomous_transaction;
  4    begin for r in 1..10 loop
  5       begin i := i+1;
  6             dbms_output.put_line(dbms_transaction.local_transaction_id(true));
  7             return;
  8       exception when others then null;
  9       end;
 10      end loop;
 11    end;
 12  begin atr;
 13        dbms_output.put_line(i);
 14  end;
 15  /
33.19.36649
34.0.370013
2

PL/SQL procedure successfully completed.



PS. я пытался обратить на это внимание еще в 19953712
...
Рейтинг: 0 / 0
Функция length
    #39359038
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так даже интересней
Код: 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.
tst> create table t1(a number);

Table created.

tst> declare i number := 0;
  2    procedure atr as
  3       pragma autonomous_transaction;
  4    begin for r in 1..10 loop
  5       begin i := i+1;
  6             insert into t1 values(i);
  7             return;
  8       exception when others then null;
  9       end;
 10      end loop;
 11    end;
 12  begin insert into t1 values(i);
 13        atr;
 14        commit;
 15  end;
 16  /

PL/SQL procedure successfully completed.

tst> select * from t1;

         A
----------
         0
         2

...
Рейтинг: 0 / 0
Функция length
    #39359080
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровРечь, естественно, про обработку именно 6519

А то, что оно все-таки пытается после обработчика пойти выполнять PL/SQL дальше ( до первого обращения к 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.
tst> create table t1(a number);

Table created.

tst> declare i number := 0;
  2    procedure atr as
  3       pragma autonomous_transaction;
  4    begin for r in 1..10 loop
  5       begin i := i+1;
  6             insert into t1 values(i);
  7             if i=1 then
  8                 return;
  9             end if;
 10       exception when others then
 11             dbms_output.put_line(sqlerrm);
 12       end;
 13      end loop;
 14    end;
 15  begin insert into t1 values(i);
 16        atr;
 17        for r in (select a from t1) loop
 18             dbms_output.put_line(r.a);
 19        end loop;
 20        rollback;
 21  end;
 22  /
ORA-06519: active autonomous transaction detected and rolled back
0
2
3
4
5
6
7
8
9
10

PL/SQL procedure successfully completed.

tst> select * from t1;

no rows selected

...
Рейтинг: 0 / 0
Функция length
    #39359105
open your mi... bug
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровНет там никакой логикину от чего же никакой. return возвращает контекст родительской транзакции независимо от реального выхода.
По сути баг. И вряд ли оракл его исправит, останется сакральными знаниями на металинке.
...
Рейтинг: 0 / 0
Функция length
    #39359272
dba123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавил к примеру Славы вывод транзакции
Код: 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.
71.
72.
73.
74.
create table t1(a number, b varchar2(64));

--
<<D>>declare 
  l_trz varchar2(30);
  n   pls_integer := 0;
procedure atr as
   pragma autonomous_transaction;
   ex6519 exception;
   pragma exception_init(ex6519, -6519);

begin 
 D.n := D.n + 1;
 for r in 1..10 loop
 -- for r in 1..1 loop
   begin 
         dbms_output.put_line('atr-beforinsert-loop-'||to_char(r)||', '||chr(9)||nvl(dbms_transaction.local_transaction_id,'нет активной транзакции'));
         insert into t1 values(D.n, 'step-atr-body-loop-'||to_char(r)||', '||dbms_transaction.local_transaction_id);
         dbms_output.put_line('atr-afterinsert-loop-'||to_char(r)||', '||chr(9)||( CASE dbms_transaction.local_transaction_id WHEN D.l_trz THEN D.l_trz ELSE dbms_transaction.local_transaction_id||', была такая транзакция' END ));

         -- не забудь закоммитить автономную транзакцию в atr
         -- иначе первый проход по циклу в автономке октатится:
         -- return - проигнорируется (вместо него исполнится rollback и ex6519)
         -- а процедура продолжит выполнение цикла, но уже в родительской
         -- адрес передачи управления - последний оператор перед блоком с return
         -- commit;
         return;
         -- а вдруг
         dbms_output.put_line('atr-afterreturn-loop-'||to_char(r)||', '||chr(9)||dbms_transaction.local_transaction_id);
     exception when ex6519 then
         dbms_output.put_line('ex6519-beforinsert-loop-'||to_char(r)||', '||chr(9)||dbms_transaction.local_transaction_id);
         insert into t1 values(D.n, 'step-atr-ex6519-loop-'||to_char(r)||', '||dbms_transaction.local_transaction_id);
         dbms_output.put_line('ex6519-afterinsert-loop-'||to_char(r)||', '||chr(9)||dbms_transaction.local_transaction_id);
   end;
  end loop;
  -- 
  dbms_output.put_line('atr-bottom-beforinsert, '||chr(9)||dbms_transaction.local_transaction_id);
  insert into t1 values(D.n, 'step-atr-bottom, '||dbms_transaction.local_transaction_id);
  dbms_output.put_line('atr-bottom-afterinsert, '||chr(9)||dbms_transaction.local_transaction_id);
  return;

exception when others then
  dbms_output.put_line('others-beforinsert, '||chr(9)||dbms_transaction.local_transaction_id);
  insert into t1 values(D.n, 'step-atr-others, '||dbms_transaction.local_transaction_id);
  dbms_output.put_line('others-afterinsert, '||chr(9)||dbms_transaction.local_transaction_id);

end atr;
begin 
      D.l_trz := dbms_transaction.local_transaction_id(true);

      dbms_output.put_line('step-'||D.n||', '||dbms_transaction.local_transaction_id);
      insert into t1 values(D.n, 'step-'||D.n||', '||dbms_transaction.local_transaction_id);
      atr;
      commit;
end;
/

step-0, 1.16.86777
atr-beforinsert-loop-1, 	нет активной транзакции
atr-afterinsert-loop-1, 	9.32.104517, была такая транзакция
ex6519-beforinsert-loop-1, 	1.16.86777
ex6519-afterinsert-loop-1, 	1.16.86777
atr-beforinsert-loop-2, 	1.16.86777
atr-afterinsert-loop-2, 	1.16.86777

PL/SQL procedure successfully completed.


scott@ORCL.HOME.LOCAL>;select * from t1;
         A B
---------- ----------------------------------------------------------------
         0 step-0, 1.16.86777
         1 step-atr-ex6519-loop-1, 1.16.86777
         1 step-atr-body-loop-2, 1.16.86777
...
Рейтинг: 0 / 0
Функция length
    #39360046
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..explicitly rolled back
откатывает текущие изменения
но не вываливает ж из автономки
Увы - нет
Код: 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.
set serveroutput on;
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    update t set value=id;
  exception
    when others then
     dbms_output.put_line('a<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
     if aDoCommit then
      commit;
     end if;
     dbms_output.put_line('a!'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  begin
   a(true);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
  dbms_output.put_line('-------------false---------');
  begin
   a(false);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
end;
/


sqlplusm->4.30.614216
a->9.7.634789
a<-6519:4.30.614216
a!
m!8.17.678840
-------------false---------
a->7.12.604347
a<-6519:8.17.678840
a!8.17.678840
m!8.17.678840
...
Рейтинг: 0 / 0
Функция length
    #39360048
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав ЛюбомудровА какой еще?
Именно в нем последний выполняемый оператор и именно из него происходит выход из процедуры (с незакрытой транзакцией, что и вызывает ORA-6519)

А мне казалось, что выход из процедуры и последний оператор это несколько разные действия.
Тем более что есть окончание блока и окончание процедуры и вынесенный отдельно exception на процедуру. Но ...
...
Рейтинг: 0 / 0
Функция length
    #39361343
stax..
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньевstax..explicitly rolled back
откатывает текущие изменения
но не вываливает ж из автономки
Увы - нет
Код: 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.
set serveroutput on;
declare
  procedure a(aDoCommit boolean)
  is
    pragma autonomous_transaction;
  begin
    dbms_output.put_line('a->'||dbms_transaction.local_transaction_id(true));
    update t set value=id;
  exception
    when others then
     dbms_output.put_line('a<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
     if aDoCommit then
      commit;
     end if;
     dbms_output.put_line('a!'||dbms_transaction.local_transaction_id);
  end a;
begin
  dbms_output.put_line('m->'||dbms_transaction.local_transaction_id(true));
  begin
   a(true);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
  dbms_output.put_line('-------------false---------');
  begin
   a(false);
  exception
    when others then
     dbms_output.put_line('m<-'||-SQLCODE||':'||dbms_transaction.local_transaction_id);
  end;   
  dbms_output.put_line('m!'||dbms_transaction.local_transaction_id(true));
end;
/


sqlplusm->4.30.614216
a->9.7.634789
a<-6519:4.30.614216
a!
m!8.17.678840
-------------false---------
a->7.12.604347
a<-6519:8.17.678840
a!8.17.678840
m!8.17.678840



не точно выразился
імхо explicitly, ето явный код программиста (commit/rollback), он может обработать ошибки в тч 6519, и напр закоммитить

в Вашем примере ето было-б напр

update t set value=id ...;
rollback; --транзакцію завершили, но остались в среде автономной
update t set value=id+1 ...;
commit;


имхо implicitly rolled back делать после завершения автономной процедуры (в которой естественной частью есть блок exception)

если грубо то -6519 должна возбуждаться в головном (мастер) блоке, поле выхода (end а)

.....
stax
...
Рейтинг: 0 / 0
Функция length
    #39361442
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
stax..,

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


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