|
|
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Пупсики, бывает ли случай, когда функция length возвращает значение 0 (ноль)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 15:20 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary DenisПупсики, бывает ли случай, когда функция length возвращает значение 0 (ноль)? Бывает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 15:22 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
AlexFF__|, не подскажешь, в каких случаях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 15:23 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary DenisAlexFF__|, не подскажешь, в каких случаях? LOB локатор ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 15:26 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary Denis, Код: plsql 1. Regards Maxim ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 15:26 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
А то был на собеседовании, не сообразил что ответить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 15:30 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
А вот это мне вообще мозг сломало Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 15:41 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary DenisА вот это мне вообще мозг сломало Код: plsql 1. 2. 3. 4. 5. Насчет 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. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 16:14 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Я только не пойму зачем надо было делать LOGICAL NON-NULL VALUE? Зачем NON? Разве не проще было сделать проверку предиката с учетом пустых значений? Ну или хотя бы в дополнение.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 16:41 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
--Eugene--Я только не пойму зачем надо было делать LOGICAL NON-NULL VALUE? Зачем NON?Ее сделали для внутреннего употребления, вылезала в эксплейне на not in или что-то вроде того. Потом, видимо кто-то задействовал в в applications и решили опубликовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 16:58 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
2 -2-, автор вылезала в эксплейне вылезала обычно тогда, когда возникает concatenation в плане 2 --Eugene-- авторЗачем NON? вот как раз за этим. lnnvl на второй ветке должен отсечь все то, что уже попало в первую, не уничтожая то, из второй, что не попало в первую ветку. во первых, если lnnvl допустит для какой-то строки null и ее не было в первой части образуемого union, то эта строка будет просто потеряна. Не имеет права lnnvl давать null - он мир разрушит при дакой способности. Во вторых, без правильного lnnvl правильный concatenation, работающий как union all, без дополнительного distict, получить нельзя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 18:12 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
booby, получить нельзя - в смысле затруднительно автоматически получить из текста конкретного запроса. Там где можно и оптимизатор обучен это делать, он сделает это не используя lnnvl ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 18:17 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
booby, да моё возмущение не про это. оно про то, что ради проверки предиката с учетом пустых значений приходится логически менять предикат на обратный. ie: [a is not null or b is not null or a = b] == [lnnvl(a != b)] ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 18:24 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
--Eugene--, во первых, вы ошибаетесь [lnnvl(a != b)] = (a = b OR a Is Null OR b Is Null) во вторых, на обратное логическое значение во второй части юниона меняется именно потому, что прямое сработало в первой. Только оно должно быть специальное обратное, такое, которое преобразует false в true, а unknown тоже в true. PS Если возмущает - презирай его. Это правильно в том отношении, что ошибок от непонимания, что творишь - не наделаешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 18:38 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
--Eugene--, прошу прощения, запечатался.. конечно же IS NULL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.11.2016, 19:12 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Пупсики, вопрос с того же собеседования. Попросили перечислить предикаты, в плане данного запроса: Код: plsql 1. 2. 3. 4. 5. Я опять облажался. Назвал только 2 из 3х. Сказали, что такой разработчик им не подходит. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 16:45 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Судя по вопросам, в этой конторе специализируются на выборках из dual ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 17:01 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Предикатов: 0 - так как в документации предикат упоминается в контексте джоина, который здесь отсутствует. 1 - так как в глоссарии "where condition". 1 - так как в википедии предикат определяется как функция, возвращающая логический результат ... 6 - так как в википедии предикат определяется как функция, возвращающая логический результат, но за функцию также считаем операции (см. sys.standard). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 18:54 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
-2-Предикатов: http://mathhelpplanet.com/static.php?p=logika-predikatov ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 19:02 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous http://mathhelpplanet.com/static.php?p=logika-predikatov Дочитал до середины, потом умер ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 19:07 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Жостьandrey_anonymous http://mathhelpplanet.com/static.php?p=logika-predikatov Дочитал до середины, потом умер Тем не менее, если рассматривать предикат в математическом смысле - как предложение, превращающееся в истинное или ложное утверждение при подстановке конкретных элементов множества, то предикатов будет ровно три: Код: plsql 1. 2. 3. которые на представленном множестве M из одного элемента 'X' превращаются в утверждения: Код: plsql 1. 2. 3. При этом на множестве M предикаты 1 и 3 - равносильны и тождественно истинны, а предикат 2 - тождественно ложен. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 19:21 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousпредикатов будет ровно три: Код: plsql 1. 2. 3. А как же предикат, определенный на множестве предикатов? Четыре! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 21:35 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
-2-А как же предикат, определенный на множестве предикатов? Четыре! Не верю :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 21:44 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
-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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.11.2016, 23:20 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary DenisА то был на собеседовании, не сообразил что ответить. Какую только хренотень ораклисты у других ораклистов ни спрашивают... Я бы и не додумался спрашивать про какую-то функцию, про которую можно прочитать в документации... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 02:04 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 11:42 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary DenisНо вопрос усугубляется тем, что в доке нет упоминания о том, как эта функция работает с empty lob-локаторами.Есть: RTFM Nulls in SQL Functions (FAQ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 12:06 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 12:32 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary DenisДрук"Коверканье" Lary DenisNulls in SQL FunctionsMost scalar functions return null when given a null argument.из этих двух предпосылок можно было бы совершенно однозначно сделать вывод, что length вернет 0 для empty-clob-ов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 13:19 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elic, И все-таки цитируя докуMost scalar functions return null when given a null argument.не тождественно нижеследующему: All scalar functions return non-null when given a non-null argument. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 13:25 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobyя бы сказалОзнакомься с книгой Введение в математическую логику Ну это если, конечно, не хочется быть шутом... мало ли какие цели ты преследуешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 13:44 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary Denis, Если некая контора делает на основании таких вопросов вывод о пригодности кандидатов, ты можешь не жалеть что ты туда не попал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 13:53 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, Возможно, у них legacy решение построенное на использовании lnnvl, знаний о length(empty_clob()) и других "хорошо" документированных возможностях СУБД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 14:31 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
env, Ага, надо было пойти еще дальше и поспрашивать 1) как collect работает с over (), хотя по доке она может быть только агрегатной 2) особенности работы ora_hash с произвольными типами включая UDF, хотя по доке во многих случаях она по доке не должна работать 3) как работает reverse на многобайтовых кодировках, хотя в доке ее вообще нет 4) детали работы полезной функции sys_op_map_nonnull 5) как вставить дату с 13-м месяцем и прочие важные детали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 14:39 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Lary DenisЯ опять облажался. Назвал только 2 из 3х. Сказали, что такой разработчик им не подходит.Какие-то пафосные пидоры эти твои наниматели, поднимающие ЧСВ за счет унижения кандидатов высосанными из пальца вопросами, имеющими лишь посредственное отношение к практике. Про уровни изоляции не спрашивали, не? Если нет - я разочарован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 16:42 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
--Eugene--, Уровни изоляции - критически важное базовое понятие, кооторое должен знать каждый разработчки БД. Я почти всегда спрашиваю. Другое дело, что в основном отвечает менее чем 1 из 5... ну это уже другая проблема. Это даже не затрагивая вопросы согласованности вызова PL/SQL из SQL, рестарты и прочие тонкости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 17:18 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
--Eugene--Про уровни изоляции не спрашивали, не?Нет, вопросы, которые я озвучил - были первыми. Сказали раз этого не знаю, то не стоит вести дальнейшую беседу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.11.2016, 17:30 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopУровни изоляции - критически важное базовое понятие, кооторое должен знать каждый разработчки БД. А вот возьму и не соглашусь :) Важное - да. Критически - нет. Мне вот до сих пор не доводилось в пром. решениях видеть применение уровней изоляции, отличных от RC - видимо, просто не повезло. И большинство разрабов прекрасно с этим живут, а ежели вдруг возникнет реальная потребность в serializable или даже в RO - то сеньор подскажет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 13:30 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbms_photoshopУровни изоляции - критически важное базовое понятие, кооторое должен знать каждый разработчки БД. А вот возьму и не соглашусь :) Важное - да. Критически - нет. Мне вот до сих пор не доводилось в пром. решениях видеть применение уровней изоляции, отличных от RC - видимо, просто не повезло. И большинство разрабов прекрасно с этим живут, а ежели вдруг возникнет реальная потребность в serializable или даже в RO - то сеньор подскажет. странно я пользовал set transaction read only; для отчетов с несколькими селектами ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 15:57 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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", а кодерством занимались другие. Ну или фантазии про грязные чтения и фантомы в Оракле иногда тоже очень впечатляют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 16:23 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopandrey_anonymousА вот возьму и не соглашусь :) Важное - да. Критически - нет. Дело не только в приминении. Дело в понимании деталей реализации. Вот-вот. Спрашиваете людей про "уровни изоляции", а услышать хотите совсем про другое, судя по "примерам из жизни" :) Только вчера обсуждали с коллегой, какие темы обсудить с разработчиками (есть у нас что-то вроде "факультатива" для заинтересованных). Как раз предлагалось обсудить "уровни изоляции". Но мне удалось убедить коллегу, что обсуждать надо не "уровни изоляции", а "data concurrency and consistency". И вот эта тема - критически важна. Это и механизмы consistent gets, и блокировки (включая itl и пользовательские), и 1555 и многое-многое другое, даже "уровни изоляции" как маленький параграф. Сюда же совершенно логично цепляются ретроспективные запросы, которые непосредственно с "уровнями изоляции" вообще не состыкуются, хотя по сути - еще одно проявление "деталей реализации". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 16:48 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Спрашивая я ожидаю лишь услышать про видимость закомиченных изменений в соседней сессии на начало стейтмента или транзакции в зависимости от RC или S соответственно. Да, уровни изоляции это лишь "маленький параграф" из области "многопользовательский доступ". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 17:40 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopСпрашивая я ожидаю лишь услышать про видимость закомиченных изменений в соседней сессии на начало стейтмента или транзакции в зависимости от RC или S соответственно. ...и именно это Знание я полагаю не критически важным, особенно на собеседовании - разработчик может быть вполне квалифицированным, но неиспользуемое Знание про уровни изоляции, отличные от RC, могло легко и непринужденно выветриться за годы практики :) Вообще собеседование - штука специфическая. Не так уж давно сам сел в лужу на вопросе "а как shared pool помогает оптимизировать запросы?", потому как мне shared pool в этом процессе никогда никак не помогал... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 17:52 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous, Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 18:10 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopandrey_anonymous, Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :)) Гм... а я бы рассказал... есть вариантик на автономке... Короче, я бы однозначно провалил собеседование на девелопера ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 18:46 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2016, 19:38 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 01:15 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 02:36 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 11:01 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. Надо знать, где на самом деле начинается автономка: Entering and Exiting Autonomous Transactions ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 20:11 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elic Код: plsql 1. Надо знать, где на самом деле начинается автономка: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 21:09 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ... andrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась. andrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN, что ты ещё раз и показал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 21:41 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicandrey_anonymousНа docs.oracle.com плиз ссылку, а не на квизы всякие :)В доке столько всего нет ... Не аргумент. В доке есть про то, что автономная транзакция автономна. И нет про то, что секция declare работает в контексте родительской транзакции. Как минимум, это не очевидно. Сталбыть, если "так задумано" - то должно было быть документировано. А если не задумано - то это либо баг, либо багофича, т.е. поведение может измениться без предупреждения. Как-то так. Elicandrey_anonymousА dirty зря выделил - оно именно dirty для автономки, которая курсор читает."Грязное" могло быть между двумя транзакциями. У тебя же вторая ещё не началась. Не принимаю. Во всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке. А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads. Elicandrey_anonymousЧто до темы "где начинается", то все просто:Нет простоты. Надо запомнить: автономка "запускается" с BEGIN То ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно. Я для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят. И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2016, 23:25 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous... Во всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке. А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads. ... Мне бы не хотелось втягиваться в терминологические споры по поводу определения того, что такое "грязное" и "чистое", но, если уж вообще пользоваться такой терминологией, то грязными я бы называл здесь записи именно внутри тела автономной процедуры порожденные. Именно что курсор открыт до начала того бегина, который изолирует контекст вложенной, рекурсивной подтранзакции. Значит, ему по документации, толкующей об изолированности автономной транзакции, положено не видеть записей, порождаемых после прохождения "точки изоляции", а он успешно видит их сплошь, по сути - в едином контексте. То, что что точка изоляции проходит по бегину это одна история - про то, что в автономную транзакцию таки можно передавать информацию о состоянии порождающей транзакции. Само по себе это спорный повод для утверждений про грязное чтение. А то, что курсор, открытый до прохождения этой точки успешно видит происходящее после нее - другая, история про то, что для такого (открытого до границы начала рекурсивной транзакции) курсора контекст в действительности един. Насчет поведение изменится в будущем. Для того, чтобы на это рассчитывать, нужно ясное понимание того, что же в этой истории является очевидным багом. Я вот не готов сказать, что он здесь есть и требует исправления. Исправления, имхо, требует текст документации. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 02:10 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousИ нет про то, что секция declare работает в контексте родительской транзакции. Как минимум, это не очевидно.Это да. andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке.Не важно, где он читается. Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама. andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов. Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался. andrey_anonymousТо ли "нет простоты", то ли "запускается с begin" - выбери плиз что-то одно.Нет. Непросто, потому что начинается с BEGIN. andrey_anonymousЯ для себя эту тему уже полностью выяснил тривиальным тестом, который намерен повторять на всех новых версиях rdbms - либо до момента, когда поведение станет документированным, либо момента, когда исправят. И не очень верю, что ты сам будешь полагаться в этом вопросе на plsqlchallenge.Мне эта тема не интересна в практическом плане: в нормальном коде у нормального разработчика подобная "неоднозначность" просто не должна возникать. Да и, как можно заметить, информация предназначалась не совсем тебе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 08:07 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicandrey_anonymousВо всех вариантах курсор ... Но читается - в автономке.Не важно, где он читается. Нетрудно понять, что при открытии курсора с ним ассоциируется не только scn, но и транзакция, чьи незафиксированные изменения можно видеть. Всё логично. Как бритва Оккама. andrey_anonymousА чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.Скорее игра слов. Для меня передача незафиксированных данных в автономку посредством курсора - давным-давно известная фича. Вряд ли полезная, поскольку я ей не пользовался. Примени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов. Тот факт, что фича давно известная, сути явления не меняет - Oracle допускает грязные чтения посредством передачи открытого курсора в автономную транзакцию. На тему "не должна встречаться в коде нормального разработчика" - это как посмотреть. В принципе, инициализация переменных в declare сама по себе не криминал. Ты вот наткнулся когда-то на то, что в узкоспециальном случае секция declare автономной транзакции выполнится в контексте родительской, я - нет. И сколько разрабов еще не наткнулись - вопрос. Несложно предположить, что кто-то инциализирует курсорные переменные в declare - с риском получить неконсистентные данные ввиду недокументированного поведения системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 10:42 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousВо всех вариантах курсор фетчится вполне себе в рамках автономки. Открывается в контексте родительской - да. Но читается - в автономке. А чтение uncomitted записей иной (в данном случае родительской) транзакции - по определению суть dirty reads.этак ты договоришься, что в приложении один поток работает с одной транзакцией, другой с другой - грязное чтение. Это не чтение грязное, а некорректная работа с транзакциями. А может и корректная, например для логирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 12:17 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
грязная записьэтак ты договоришься Эт вряд ли. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 12:45 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
грязная запись, он прав. тут ведь "грязное" чтение имеется в виду не в морально-этическом смысле. это просто такой термин. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.11.2016, 15:45 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 02:02 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Кстати, и стандартная дока в картинках показывает где именно замораживается родительская и стартует автономная транзакция ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 06:12 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров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.Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 07:56 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНа 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 и можно не особо опасаться изменений в поведении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:10 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Следующее сообщение еще не посмотрел? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:15 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousПримени упомянутую тобой бритву Оккама к теме и называй вещи своими именами - чтение не зафиксированных данных одной транзакции в другой - это "грязное чтение", не надо никаких эфмеизмов. А еслиб ты эти данные передал параметром (ну скажем в виде коллекции), то ты бы тоже называл это "грязным чтением"? Просто Элик различает неявную передачу параметров, через declare и грязные чтения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 09:56 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Почитав ветку нашел "вопрос для собеседования". Предсказать результат запроса: Код: plsql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:08 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, для окончательного выноса мозга еще и Код: plsql 1. добавить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:12 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровСледующее сообщение еще не посмотрел? Посмотрел. Не согласен, что тема освещена. В ноте - да, в доке - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:27 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевА еслиб Сергей, если бы у бабушки был член - она была бы дедушкой. В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов. По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads. Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:34 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousСергей АрсеньевА еслиб Сергей, если бы у бабушки был член - она была бы дедушкой. В указанной "а если" логике dirty reads вообще не существует, равно как и связанных с ними феноменов. По факту мы можем, применяя исключительно механизмы СУБД, для которых заявлена поддержка ACID, получить феномены, характерные для dirty reads. Этого не надо бояться, это надо пометить флажком, чтобы при необходимости - правильно использовать, а без необходимости - просто не наступать.А если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch? Есть же, к примеру, ORA-08177 Can't serialize access for this transaction On index Block splits ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:53 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousВячеслав ЛюбомудровСледующее сообщение еще не посмотрел? Посмотрел. Не согласен, что тема освещена. В ноте - да, в доке - нет.На картинке какие-то непонятки? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 10:54 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
ORA__SQLА если Oracle выстреливал бы exception, если контекст, при котором был открыт курсор, измененился по отношению к контексту, при котором выполняется fetch? А он меняется? Судя по тому, что возвращает - нет. Курсор работает в той транзакции, которая его создала. Меняется только не совсем явное построение туннеля для передачи результата в новую транзакцию. Механизм передачи данных из одной транзакции в другую в обход (в т.ч. в виде параметров, dbms_pipe и пр.) в любом случае нарушает изоляцию транзакций. Просто это не считается за dirty reads. Вот если б этот курсор начал читать еще и назакомиченные данные вставленные в автономке - вот тогда был бы dirty reads. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 11:25 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
[quot Сергей Арсеньев]ORA__SQLА он меняется? XID же другой. Запрещать или нет делать fetch при новом xid - это вопрос. Сергей АрсеньевКурсор работает в той транзакции, которая его создала.У курсора есть два этапа: open и fetch. Открыли в одной (зафиксировали результат на некоторый scn), тянуть данные пытаемся позже, в другой транзакции. Результат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра. А бы сделал такой вывод: не важно, когда и при каких условиях мы делаем fetch. Фаза open всегда определяет содержимое курсора. При каких условиях открыли, то и получили. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:08 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 12:50 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНа картинке какие-то непонятки? На картинке в declare ничего транзакционного нет - сделать вывод о работе секции declare в контексте основной транзакции даже по отдельно взятой картинке очень сложно, а вместе с текстом - невозможно, поскольку в тексте заявлено, что прагма действует на pl/sql unit, а не на часть его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:28 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевПросто это не считается за dirty reads. Кем не считается и почему? ORA__SQLРезультат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра. Именно в этом варианте, на мой взгляд, нельзя было бы говорить о dirty reads, поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:36 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousORA__SQLРезультат будет аналогичный, если open и fetch сделать в родительской, запомнить результат и передать его в автономку в виде параметра.Именно в этом варианте, на мой взгляд, нельзя было бы говорить о dirty reads, поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр).Так и нет же никакой разницы передать через параметр или сделать fetch. Фаза fetch вообще оторвана от транзакции и всего остального. Просто вычитывается ранее сохраненный результат. Что собственно и верно. Иначе была полная неразбериха. Из-за open-fetch вся путаница. Сделать через for cur in (select * from) loop end loop; не получится. Так что за уши притянутый случай. dirty reads нет и быть не может. А вот то, что autonomous_transaction начинается с BEGIN - важный нюанс раскопали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:54 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
ORA__SQLОткрыли в одной (зафиксировали результат на некоторый scn), тянуть данные пытаемся позже, в другой транзакции. Ну и чем это отличается от чтения в транзакции A и отправки результатов в транзакцию B xthtp dbms_pipe. Ну или совсем простом случае - передачи информации из row level триггера автономно работающей процедуре, которая сохранит их в журнал. Ни чем. И в том и в другом случае нарушение изоляции. Осознанное и управляемое. Главное, чтоб сам курсор не запутался в том, данные какой транзакции он читает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 14:56 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymous поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр). А здесь ты передаешь данные через переменную. Очень гигантская разница. SQL машина работает в одной транзакции и передает данные в PL/SQL, работающий в другой. Никто из них dirty reads не делает. Межтранзакционное взаимодействие есть, оно нарушает ACID. P.S. Хочешь dirty reads - делай дамп блока и парси ручками. Такой механизм в Oracle есть :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:04 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевandrey_anonymous поскольку для передачи данных в транзакцию мы использовали бы явные внетранзакционные механизмы (передача данных через параметр). А здесь ты передаешь данные через переменную. Очень гигантская разница. Вообще-то разница существенная. Для переданных извне данных никто нигде не гарантировал корректность. Поэтому разработчики обычно проверяют переданные извне параметры. Чуть более дискуссионный вопрос - о заранее открытом глобальном курсоре. Адекватный разработчик понимает, что данные в этом курсоре могут быть не консистентны с состоянием базы, в котором работает его транзакция - т.е. он может столкнуться с феноменами нарушения изоляции, в т.ч. с dirty reads, phantom reads. И называет эти явления своими именами , а не "не считается". Ну и собственно для меня тема диспута - не в dirty как таковых (предсказуемо, управляемо, может быть полезно), а в том, что разработчик, написавший ( на основании документации ) код вида: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. вообще говоря , вправе ожидать, что курсор откроется в контексте автономной транзакции. Но ввиду недокументированного поведения (судя по ноте - documentation bug) может не просто попасть на неприятности, но и обнаружить их на очень-очень позднем этапе. И хорошо еще, если автономка используется для целей логирования. Как-то так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:27 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousнаписавший ( на основании документации ) код вида: Код: plsql 1. 2. вообще говоря, вправе ожидать, что курсор откроется в контексте автономной транзакции.А если такой: Код: plsql 1. 2. Его ожидания имеют права отличаться? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:51 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
ElicА если такой: Код: plsql 1. 2. Его ожидания имеют права отличаться? Почитаем доку вместе? 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 15:58 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
[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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:01 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:09 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:19 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевПочитав ветку нашел "вопрос для собеседования". Предсказать результат запроса: Код: plsql 1. 2. 3. 4. так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен если убрять where rownum=1, у Вас работает? ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:20 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousА это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous".Тебе не надоело бессмысленно спорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:21 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicandrey_anonymousА это весьма существенный момент, достойный отдельного упоминания на фоне выше процитированного "marks a routine as autonomous".Тебе не надоело бессмысленно спорить? Не бессмысленно. Я в ходе дискуссии я полностью определился в своем отношении к обсуждаемому явлению (autonomous declare). До ссылки на нотку это был забавный недокументированный побочный эффект с непонятным будущим, после ссылки на нотку я склонился к версии о баге в документации. А в целом - мне кажется, что тема полностью раскрыта. Всем спасибо за участие, особенно Elicу и Владимиру Любомудрову за любезно предоставленные ссылки и квалифицированное оппонирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 16:34 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousСергей Арсеньевпропущено... А здесь ты передаешь данные через переменную. Очень гигантская разница. Вообще-то разница существенная. Для переданных извне данных никто нигде не гарантировал корректность. И тут ты передаешь извне через переменную к которой есть общий доступ. То, что эта переменная позволяет дергать SQL машину в другой транзакции вполне ожидаемое поведение. Но это не означает, что происходит грязное чтение - происходит именно межтранзакционное взаимодействие. Заданное (хотя возможно и неожиданно) программистом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:00 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax..если убрять where rownum=1, у Вас работает? Поработает, поработает и прибивает серверный процесс... :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:02 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax..так как явной сортировки нет, полагатся на order by id desc из over врядли стоит, результат возможно неопределен Это то пол беды, у меня результат - массив с одним элементом, а не с 9, как в случае без order by (который не падает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:03 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:07 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев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-м месяцем и прочие важные детали... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:13 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopНе стоит баловаться с возможностями, В работе не стоит использовать, а баловаться то почему нельзя? P.S. Фиг с ней с агрегативностью, rownum то почему пробрасывается, хотя план запроса говорит об оратном? Или это тоже документированное поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:16 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Ни у кого 12 под рукой нет? Что он возвращает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:18 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
andrey_anonymousdbms_photoshopandrey_anonymous, Ладно, ладно, путь разработчик хотя бы говоря про RC не рассказывает про грязные чтения. :)) Гм... а я бы рассказал... есть вариантик на автономке... Короче, я бы однозначно провалил собеседование на девелопера Как уже многие заметили, особенности работы с передаваемыми реф курсорами в качестве параметров в автономки даже с натяжкой сложно трактовать как грязные чтения. Я с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:23 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, Срегей, еще раз. Collect - агрегатная функция. И в 12с тоже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:25 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopЯ с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :) А вот это уже чистой воды грязные чтения. :) P.S. Понятно, что тоже не документировано, но поменяли ли поведение? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:27 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевdbms_photoshopЯ с таким же успехом могу сказать, есть у меня один вариантик на дапме и парсе текущей версии блока - get_row_info . :) А вот это уже чистой воды грязные чтения. :) P.S. Понятно, что тоже не документировано, но поменяли ли поведение?Чего менять-то? Ивент сделать недоступным? :)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:34 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньевdbms_photoshopНе стоит баловаться с возможностями, В работе не стоит использовать, а баловаться то почему нельзя? P.S. Фиг с ней с агрегативностью, rownum то почему пробрасывается, хотя план запроса говорит об оратном? Или это тоже документированное поведение?Имелось в виду, что с выводами от баловста надо быть осторожным. Очевидно что rownum не должно срабатывать до аналитики. Интересные моменты по этому поводу были тут Объясните поведение аналитической функции . Я таки предпринял попытку кратко описать механизм срабатывания "разных частей запроса". Когда уважаемые ревьюверы заревьювят - опубликую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:37 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopЧего менять-то? Ну падение убрать, ненароком, я про агрегат оконный. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:37 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopОчевидно что rownum не должно срабатывать до аналитики. Он вообще от другого запроса. :) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:41 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев, ORA-03113 по прежнему отлично ловится, по крайней мере, на 12.1.0.2 на "аналитическом" collect (с сортировкой). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:41 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshop, И элемент в коллекции, видать тоже 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:44 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopОчевидно что rownum не должно срабатывать до аналитики.Fixed. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.11.2016, 17:44 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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у и Владимиру Любомудрову за любезно предоставленные ссылки и квалифицированное оппонирование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 03:00 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав Любомудров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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 07:53 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 16:21 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax..почему m<- в null? 15 rollback; закрыл "мастер" транзакцию procedure a откатает изменнения и в "мастер" транзакцииСтанислав, ты то ли не владеешь знаками препинания, то ли разговариваешь сам с собой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:00 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicstax..почему m<- в null? 15 rollback; закрыл "мастер" транзакцию procedure a откатает изменнения и в "мастер" транзакцииСтанислав, ты то ли не владеешь знаками препинания, то ли разговариваешь сам с собой. и то и другое так луче/понятней? [quot stax..]почему m<- в null? 15 rollback; закрыл "мастер" транзакцию . procedure a откатает изменнения и в "мастер" транзакции . ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.11.2016, 17:52 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elic......Настало время задуматься Да уж, зажигательный вариант истории, про то, почему никогда не пиши when others ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 00:20 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobyElic......Настало время задуматься Да уж, зажигательный вариант истории, про то, почему никогда не пиши when others Т.е. - ошибки программиста должны обнаруживать себя наиболее очевидным способом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 00:23 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. С другой стороны, почему ошибка обрабатывается в обработчике автономной процедуры? Таки, наверное, контекст транзакции уже восстановлен, а обработчик исключительных ситуаций еще нет И вот еще прикол Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 05:51 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровТаки 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 13:06 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobyникогда не пиши when others then null end; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 13:51 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
AmKadboobyникогда не пиши when others then null end; в данном случае свет гасит не команда Null - ты хоть весь бэктрейс туда запихни, оно вообще не обязано быть замеченным, что где-то в извилинах массового процесса по дороге свет погас. свет гасит именно сам when others ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 13:59 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobyAmKadпропущено... в данном случае свет гасит не команда Null - ты хоть весь бэктрейс туда запихни, оно вообще не обязано быть замеченным, что где-то в извилинах массового процесса по дороге свет погас. свет гасит именно сам when others ну, что-то сорта Код: plsql 1. 2. 3. вполне допустимо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 14:16 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobyну, что-то сорта Код: plsql 1. 2. 3. Ну так ведь еще можно сделать и что-нибудь более осмысленное, например залоггировать ошибку и ее "окружение". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 14:53 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobyну, что-то сорта Код: plsql 1. 2. 3. вполне допустимо. Код: plsql 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 15:17 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровElicпропущено... Настало время задуматься, а какая транзакция может быть в EXCEPTION? Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. С другой стороны, почему ошибка обрабатывается в обработчике автономной процедуры? Таки, наверное, контекст транзакции уже восстановлен, а обработчик исключительных ситуаций еще нет И вот еще прикол Код: 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. для меня неочевидным есть то что в блоке exception (часть автономной процедуры) мы уже находимся в контексте основной транзакции ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 15:31 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
-2-boobyну, что-то сорта Код: plsql 1. 2. 3. вполне допустимо. Код: plsql 1. не страшно comm и так 0 а от то что закоммитет основную транзакцию, ето уже посерьезнее ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 15:37 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax.., вот вот. а если читать описание к ORA-6519, потом перечитывать и на досуге вдумываться, то ведь, там же все написано. Здесь самое не очевидное, что написанному, оказывается, в данном случае, следует верить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 15:38 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 15:47 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax..откаталось и что, где сдесь что вернулись в контекст мастер транзакции?А куда ещё? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 16:14 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax..// transaction is implicitly rolled back and this error is raised. ... откаталось и что, где сдесь что вернулись в контекст мастер транзакции? Откатились - значит транзакции нет. Вообще блок exception по сути своей переходной. Из процедуры уже вышли, а к вызывающему еще не вернулись. Вот где написано, что в моем варианте перехватит блок b. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 16:35 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax.., and здесь, неожиданно, следует читать, как союз определяющий последовательность действий. Сначала происходит откат, потом выброс информации о том, что программист совершил ошибку. Т.е. к моменту выброса такой ошибки, транзакции, подвергнутой rollback, уже нет. нельзя уже оказаться в ее контексте и, тем более, вернуться в него. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 16:44 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Elicstax..откаталось и что, где сдесь что вернулись в контекст мастер транзакции?А куда ещё? как куда остатся в автономке, в ексепшене может быть любой код, ето часть процедуры с autonomous_transaction напр exception when ex6519 then write_log(); commit; ... rollback в теле процедуры не вываливает ж в мастер транзакцию сделали implicitly rolled back , но зачем закрывать автономку, причем implicitly rolled back делать если нет обработчика почему для других исключений автономка не заканчивается? имхо баг/фича ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 17:04 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевВообще блок exception по сути своей переходной. Из процедуры уже вышли, а к вызывающему еще не вернулись. что значит из "процедуры уже вышли" exception ето часть процедуры, и там может быть нехилый код ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 17:08 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobystax.., and здесь, неожиданно, следует читать, как союз определяющий последовательность действий. Сначала происходит откат, потом выброс информации о том, что программист совершил ошибку. Т.е. к моменту выброса такой ошибки, транзакции, подвергнутой rollback, уже нет. нельзя уже оказаться в ее контексте и, тем более, вернуться в него. в ексепшене можно начать новую транзакцию изолированную от мастер explicitly rolled back откатывает текущие изменения но не вываливает ж из автономки Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. имхо бага/фича ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 17:17 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax.., почему для других исключений автономка не заканчивается? Потому что другие исключения гарантированно происходят до Return/End procedure_at А про это исключение ты должен думать так: Не веря в программиста, зная, что тот всегда пишет то, чего сам не понимает, компилятор , в момент компиляции такой процедуры принудительно вставляет перед каждым return/End procedure вызов метода, производящего принудительные действия по откату с уведомлением в виде ошибки, если к этому моменту автономная транзакция еще не завершена. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 17:19 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
boobystax.., почему для других исключений автономка не заканчивается? Потому что другие исключения гарантированно происходят до Return/End procedure_at А про это исключение ты должен думать так: Не веря в программиста, зная, что тот всегда пишет то, чего сам не понимает, компилятор , в момент компиляции такой процедуры принудительно вставляет перед каждым return/End procedure вызов метода, производящего принудительные действия по откату с уведомлением в виде ошибки, если к этому моменту автономная транзакция еще не завершена. причем тут компилятор если в коде есть обработчик исключения Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 17:43 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
stax.., Ны хочешь rollback to savepoint, но там может быть только rollback, а он завершает текущую транзакцию. На открыть новую, не связанную с мастер запрета нет. И сделать ты это скорее обязан (собственными руками), раз уж ты решил, что тебе в этом месте необходимо явно перехватывать ошибку из категории "ошибка программиста". каким нибудь Insert into your_super_log ты вполне достигнешь этой цели, но если эта, вновь открытая транзакция останется незавершенной при выходе из процедуры по нговому пути следования, то снова возникнет та же ошибка, которая уже не будет возвращать тебя в исходную точку твоего перехвата. Компилятор здесь при том, что он знает синтакис, используемый в твоем исходном коде, умеет как забраковать его, объявив негодным к компиляции, так и преобразовать к виду, годному для исполнения. В этом месте все тапки его. А в данном случае, если работу по управлению подтранзакией не сделает компилятор, путем внесения в твой код вызовов, подразумеваемых наличием тобой написанной прагмы, то и сделать это будет некому, с учетом всех ожидаемых для данного варианта использования кода соглашений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 23:45 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
booby, сорри НТы хочешь ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.12.2016, 23:47 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей АрсеньевВот где написано, что в моем варианте перехватит блок b.А какой еще? Именно в нем последний выполняемый оператор и именно из него происходит выход из процедуры (с незакрытой транзакцией, что и вызывает ORA-6519) Хотя, конечно, выглядит это (да и наверняка, является) как баг. Обработка ошибки, на мой взгляд, должна проводиться или за пределами автономной транзакции (конечно, концептуально это не очень красиво) или в новой автономной транзакции (на которую уже не генерить ошибку, чтоб не допустить рекурсии, что наверняка сложнее). Т.е. либо крестик снимите, либо трусы оденьте. А то, получается, из автономной транзакции, по определению являющейся отдельной от родительской, я тем не менее могу откатить или подтвердить родительскую транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 03:02 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Речь, естественно, про обработку именно 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. PS. я пытался обратить на это внимание еще в 19953712 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 03:23 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вот так даже интересней Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 03:34 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровРечь, естественно, про обработку именно 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 09:03 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровНет там никакой логикину от чего же никакой. return возвращает контекст родительской транзакции независимо от реального выхода. По сути баг. И вряд ли оракл его исправит, останется сакральными знаниями на металинке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 09:38 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Добавил к примеру Славы вывод транзакции Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.12.2016, 13:03 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
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. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2016, 15:53 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Вячеслав ЛюбомудровА какой еще? Именно в нем последний выполняемый оператор и именно из него происходит выход из процедуры (с незакрытой транзакцией, что и вызывает ORA-6519) А мне казалось, что выход из процедуры и последний оператор это несколько разные действия. Тем более что есть окончание блока и окончание процедуры и вынесенный отдельно exception на процедуру. Но ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.12.2016, 15:55 |
|
||
|
Функция length
|
|||
|---|---|---|---|
|
#18+
Сергей Арсеньев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. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.12.2016, 16:13 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1886876]: |
0ms |
get settings: |
7ms |
get forum list: |
15ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
69ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
198ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 539ms |

| 0 / 0 |
