|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
авторОно может быть вообще любым - остаться в своем исходном значении, очиститься до null, содержать последнее присвоенное в процедуре значение или содержать некий случайный мусор. Скажите, а можно про это где-то прочитать в авторитетных источниках? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 19:05 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
konaz_714 авторОно может быть вообще любым - остаться в своем исходном значении, очиститься до null, содержать последнее присвоенное в процедуре значение или содержать некий случайный мусор. Скажите, а можно про это где-то прочитать в авторитетных источниках? +1 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 19:08 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
konaz_714 авторОно может быть вообще любым - остаться в своем исходном значении, очиститься до null, содержать последнее присвоенное в процедуре значение или содержать некий случайный мусор. Скажите, а можно про это где-то прочитать в авторитетных источниках? Да-да, а то ваше эмоциональное сумбурное изложение "на пальцах", но без примеров может кого угодно запутать. Пока я понял, что в переменной для параметра OUT NOCOPY может быть случайное значение при аварии в вызываемой процедуре. И ничего странного я в этом не обнаружил. "Все почти с ума свихнулись, даже, кто безумен был..." (с) В. Высоцкий ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 19:14 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
konaz_714 авторОно может быть вообще любым - остаться в своем исходном значении, очиститься до null, содержать последнее присвоенное в процедуре значение или содержать некий случайный мусор. Скажите, а можно про это где-то прочитать в авторитетных источниках? о как, это ничего, что книжку вы пишите, а не я. Я же не спрашиваю, в каких авторитетных источниках вы взяли содержание 113 страницы, просто вижу, что чепуха. С полным отсутствием эмоций. И даже мне ( ) oracle не только не обещал легкого последующего доступа к своим ранее выложенным white papers, но и не давал обещания их хранить у себя сколько-нибудь долгое время. Была отдельная статья именно на эту тему, как раз во времена 11й версии. Точного названия и ссылки у меня нет, по памяти смысл названия был в духе "о гарантиях, которые предоставляет pl/sql" Цитировал я по памяти, с учетом того, что статье точно больше 10 лет уже. К счастью, именно этот момент они, наконец, включили в сжатом виде в документацию: https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-subprograms.html#GUID-518B8827-26CC-4734-B799-ACB038185638 If the subprogram ends with an exception, then the value of the actual parameter is undefined . В данном случае это надо понимать именно в смысле отсутствия каких бы то ни было гарантий на содержимое переменной - приемника. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 19:40 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
была еще статья 2003 года времен 10й версии от Charles Wetherell (ещё авторитетнее уже дальше некуда), "Freedom, Order, and PL/SQL Optimization" Во многих отношениях полезная, и прилегающая, там в широком плане рассматривается вопрос влияния исключений на порядок выполнения кода, но именно интересующего в моменте полезного фрагмента текста, за 30 секунд я не нашел. Сорри, на этом поиски я прекращаю, в надежде, что ссылки на официальную документацию достаточно. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 20:00 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
booby К счастью, именно этот момент они, наконец, включили в сжатом виде в документацию: https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-subprograms.html#GUID-518B8827-26CC-4734-B799-ACB038185638 If the subprogram ends with an exception, then the value of the actual parameter is undefined . В данном случае это надо понимать именно в смысле отсутствия каких бы то ни было гарантий на содержимое переменной - приемника. Очень хорошо, что вы это подчеркнули. И приведенная вами документация по Oracle 21c доходчиво описывает ситуацию: 9.7.3 Subprogram Parameter ModesRegardless of how an OUT or IN OUT parameter is passed:
В документации по Oracle 10g R2 пишут то же самое, но немного другими словами: "If you exit a subprogram successfully, PL/SQL assigns values to the actual parameters. If you exit with an unhandled exception, PL/SQL does not assign values to the actual parameters." В документации по Oracle 9i R2 и Oracle 8i пишут то же самое, но немного другими словами: "If you exit a subprogram successfully, PL/SQL assigns values to the actual parameters. However, if you exit with an unhandled exception, PL/SQL does not assign values to the actual parameters." If you exit a subprogram successfully, PL/SQL assigns values to the actual parameters. However, if you exit with an unhandled exception, PL/SQL does not assign values to the actual parameters. В итоге имеем давным-давно описанное в документации поведение: (1) Если подпрограмма заканчивается нормально, фактическое значение параметра равно последнему значению, присвоенному формальному параметру. (2) Если подпрограмма заканчивается с возбуждением исключения, фактическое значение параметра не определено. По-моему, вполне логичное поведение. Спасибо, что обратили на него наше внимание. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.02.2022, 20:13 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
SQL*Plus .... However, if you exit with an unhandled exception, PL/SQL does not assign values to the actual parameters. .... Вот этого не "другими словами". Это буквально то, что порождает 113-ые страницы. Ясно, что человеку образованному, и с большим опытом, понять этого никакой возможности нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 00:36 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
booby https://docs.oracle.com/en/database/oracle/oracle-database/21/lnpls/plsql-subprograms.html#GUID-518B8827-26CC-4734-B799-ACB038185638 If the subprogram ends with an exception, then the value of the actual parameter is undefined . А парой абзацев ниже: When an OUT or IN OUT parameter is passed by reference, the actual and formal parameters refer to the same memory location. Therefore, if the subprogram changes the value of the formal parameter, the change shows immediately in the actual parameterА это надо понимать как гарантию на содержимое переменной - приемника. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 09:11 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
Elic ... А парой абзацев ниже: When an OUT or IN OUT parameter is passed by reference, the actual and formal parameters refer to the same memory location. Therefore, if the subprogram changes the value of the formal parameter, the change shows immediately in the actual parameter Может быть. При условии, что хинт nocopy действительно отработал и привел к передаче по ссылке. Я хорошо помню, как кто-то меня макал в неумение опознавать это на глаз Но такая гарантия мгновенной изменчивости приемника не имеет ничего общего с обещанием всегда оставить входной параметр в исходном значении при возникновении ошибки. PS Мне правда жаль, что у меня потеряна та статья, на которую я умственно ссылался. А Уизерела надо будет перечитать, при удобном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 14:18 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
я не знаю, с какой легкостью "Freedom, Order, and PL/SQL Optimization" сейчас отыскивается на OTN, поэтому приложу файл для желающих ознакомиться, если кто-то не читал ранее. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 14:28 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
booby Elic А это надо понимать как гарантию на содержимое переменной - приемника. "is passed by reference" - это значит, что хинт nocopy сработал. booby Я хорошо помню, как кто-то меня макал в неумение опознавать это на глаз booby Но такая гарантия мгновенной изменчивости приемника не имеет ничего общего с обещанием всегда оставить входной параметр в исходном значении при возникновении ошибки. Я бы эту детскую боязнь сравнил с древней страшилкой, что когда-нибудь '' is null станет false. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 16:47 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
Что касается качества документации, то она, к сожалению, только ухудшается. Многие упоминания про undetermined results из неё пропадают в последних версиях. Или взять по той же ссылке дебильный пример: >=11gR2Formal OUT and IN OUT parameters can be returned in any order. In this example, the final values of x and y are undefined: Код: plsql 1. 2. 3. 4. 5.
На самом деле тут должно было быть приблизительно следующее:Может в какой-нибудь версии исправятFormal OUT and IN OUT parameters can be returned in any order. In this example, the final values of z are undefined: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Я лет 10 назад много раз убеждал Стивена, что это именно "are undefined". Похоже, что он согласился и донёс это тогда до Bryn Llewellyn. Но в документацию это попало в такой вот уё$ищной форме :( То же касается out-ов в EI. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 17:31 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
Elic Я бы эту детскую боязнь сравнил с древней страшилкой, что когда-нибудь '' is null станет false. Да, я помню такую оговорку в документации. Возможно, отражающую былые споры. По некоторому размышлению, пришел к надежде, что пока оракловым дедам удается игнорировать оптимизацию местного образования, этого не произойдет. По крайней мере, не при их жизни. Такой заход обязан порождать две конкатенации вместо одной. А чтобы умножать сущности, нужно быть молодым и рьяным. booby Ты начинаешь противоречить сам себе (и документации). initial<>undetermined Контекст обсуждения задан предложенной к изучению 113ой страницей книжки, ссылка на которую на предыдущей странице. Кстати, речь не идет об undetermined. Значение как-то всегда determined в конкретном вычислении в том отношении, что какое-то точно есть. Но оно undefined в смысле наличия гарантий на то, как именно должно быть описано поведение системы времени выполнения, следуя которому возможно не просто предсказать, какое оно будет, а предсказать специально в целях использования для построения вокруг этого поведения некоторой прикладной логики. Так получилось, что где-то в районе7-8 года, я сам страдал подобными идеями. Но вовремя попались под руку пара статей, одну из которых я выложил в предыдущем посте. Если ты случайно ее не читал, специально посмотри. Там и текст качественный, и автор - "главный по тарелочкам" в области pl/sql. То есть, попросту - научный руководитель проекта pl/sql. Elic ... "is passed by reference" - это значит, что хинт nocopy сработал. ... Я просто знаю, что документация давным-давно разъясняет, когда хинт "игнорируется" (просто из-за того, что нет чёткого "memory location"). Процедура с nocopy хинтом пишется один раз, а используется многократно и в разных условиях. В одних условиях вызова передача параметра произойдет по ссылке, в других будет образована копия в созданной для этой цели временной переменной. Если я правда собрался натягивать вокруг "гарантий" логику, я должен быть уверен, что в каждом случае, когда мне приспичило ей воспользоваться, она точно работает. Ура, я понял тогда, в интересовавших меня случаях, она точно не работает. нет чёткого "memory location" - классная формулировка 👍 ElicFormal OUT and IN OUT parameters can be returned in any order. In this example, the final values of z are undefined: Это про алиасинг. Тема хорошая, сам попадал "по молодости". Он может и без Out параметров возникать. "не ваше дело, в какой последовательности формируются out-параметры" - лишь вишенка на этом торте. Вот тут Коннор Макдоналд показывает примеры, выводящие на соседнюю тему - супер-агрессивность оптимизатора кода, например, в части оптимизации выражений. Не могу похвастать, что это вызывает у меня восторг до степени хлопанья в ладоши. https://connor-mcdonald.com/2019/04/16/pl-sql-dont-mix-and-match-scope/ (Я не прочитал, что поэтому поводу есть у автора обсуждаемой книжки) ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 18:52 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
booby Процедура с nocopy хинтом пишется один раз, а используется многократно и в разных условиях. В одних условиях вызова передача параметра произойдет по ссылке, в других будет образована копия в созданной для этой цели временной переменной. Если я правда собрался натягивать вокруг "гарантий" логику, я должен быть уверен, что в каждом случае, когда мне приспичило ей воспользоваться, она точно работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.02.2022, 19:36 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
Предлагаю вернуться к 113 странице обсуждаемой книги. Сейчас там написано вот так: авторОсновное отличие режима передачи OUT от режима IN OUT заключается в том, что OUT-параметр становится неинициализированным при передаче внутрь процедуры или функции, то есть то значение, которое имела во внешнем блоке переменная-фактический параметр, теряется (становится равным NULL). Это верно во всех случаях, за исключением ситуации, когда внутри процедуры или функции инициируется необработанное в ней исключение. Тогда во внешнем блоке у переменной-фактического параметра для формального OUT-параметра сохранится то ее значение, которое было до передачи. У фактических параметров для формальных IN OUT-параметров значение в NULL не сбрасывается. Если значение фактического параметра внутри программы не меняли, то и после завершения вызова программы оно будет таким же, каким оно было до передачи в программу. Приведем примеры передачи значений параметров в различных режимах. Неточность заключается вот в этом месте "Это верно во всех случаях, за исключением ситуации, когда внутри процедуры или функции инициируется необработанное в ней исключение. Тогда во внешнем блоке у переменной-фактического параметра для формального OUT-параметра сохранится то ее значение, которое было до передачи". Предлагается заменить в рукописи текст на автор"Это верно во всех случаях, за исключением ситуации, когда внутри процедуры или функции инициируется необработанное в ней исключение. Тогда во внешнем блоке у переменной-фактического параметра для формального OUT-параметра значение не определено". При желании можно еще расписать the semantics of an OUT parameter is a) set it to null b) call procedure c) upon success, copy the value back out Когда происходит исключение, 3 шаг не выполняется. При передаче OUT-параметра по ссылке с помощью конструкции NOCOPY это и приводит к неопределенности. И привести примеры 1 и 4 вот отсюда . ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2022, 17:09 |
|
Нужна книга по изучению PL/SQL
|
|||
---|---|---|---|
#18+
Вот на всякий случай текст книги по PL/SQL в формате Microsoft Word. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.02.2022, 14:57 |
|
|
start [/forum/topic.php?fid=52&msg=40133619&tid=1879507]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 177ms |
0 / 0 |