powered by simpleCommunicator - 2.0.31     © 2024 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна книга по изучению PL/SQL
17 сообщений из 67, страница 3 из 3
Нужна книга по изучению PL/SQL
    #40133603
konaz_714
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
авторОно может быть вообще любым - остаться в своем исходном значении, очиститься до null, содержать последнее присвоенное в процедуре значение или содержать некий случайный мусор.

Скажите, а можно про это где-то прочитать в авторитетных источниках?
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133606
Melkomyagkii_newbi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konaz_714
авторОно может быть вообще любым - остаться в своем исходном значении, очиститься до null, содержать последнее присвоенное в процедуре значение или содержать некий случайный мусор.


Скажите, а можно про это где-то прочитать в авторитетных источниках?

+1
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133609
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konaz_714
авторОно может быть вообще любым - остаться в своем исходном значении, очиститься до null, содержать последнее присвоенное в процедуре значение или содержать некий случайный мусор.

Скажите, а можно про это где-то прочитать в авторитетных источниках?
Да-да, а то ваше эмоциональное сумбурное изложение "на пальцах", но без примеров может кого угодно запутать.
Пока я понял, что в переменной для параметра OUT NOCOPY может быть случайное значение при аварии в вызываемой процедуре.
И ничего странного я в этом не обнаружил.

"Все почти с ума свихнулись, даже, кто безумен был..." (с) В. Высоцкий
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133619
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 .
В данном случае это надо понимать именно в смысле отсутствия каких бы то ни было гарантий на содержимое переменной - приемника.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133622
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
была еще статья 2003 года времен 10й версии от Charles Wetherell (ещё авторитетнее уже дальше некуда),
"Freedom, Order, and PL/SQL Optimization"

Во многих отношениях полезная, и прилегающая, там в широком плане рассматривается вопрос влияния исключений на порядок выполнения кода, но именно интересующего в моменте полезного фрагмента текста, за 30 секунд я не нашел.
Сорри, на этом поиски я прекращаю, в надежде, что ссылки на официальную документацию достаточно.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133624
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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:
  • If the subprogram exits successfully, then the value of the actual parameter is the final value assigned to the formal parameter. (The formal parameter is assigned at least one value—the initial value.)
  • If the subprogram ends with an exception, then the value of the actual parameter is undefined.
То же самое написано и в документации по Oracle 19c , Oracle 11g R2 .

В документации по 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) Если подпрограмма заканчивается с возбуждением исключения,
фактическое значение параметра не определено.

По-моему, вполне логичное поведение.

Спасибо, что обратили на него наше внимание.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133661
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL*Plus

....
However, if you exit with an unhandled exception, PL/SQL does not assign values to the actual parameters.
....

Вот этого не "другими словами".
Это буквально то, что порождает 113-ые страницы.
Ясно, что человеку образованному, и с большим опытом, понять этого никакой возможности нет.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133679
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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А это надо понимать как гарантию на содержимое переменной - приемника.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133738
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Мне правда жаль, что у меня потеряна та статья, на которую я умственно ссылался.
А Уизерела надо будет перечитать, при удобном случае.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133740
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не знаю, с какой легкостью "Freedom, Order, and PL/SQL Optimization" сейчас отыскивается на OTN,
поэтому приложу файл для желающих ознакомиться, если кто-то не читал ранее.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133753
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Elic
А это надо понимать как гарантию на содержимое переменной - приемника.
Может быть. При условии, что хинт nocopy действительно отработал и привел к передаче по ссылке.
Обрати внимание, что ни я, ни документация в этом месте не упоминаем nocopy.
"is passed by reference" - это значит, что хинт nocopy сработал.
booby
Я хорошо помню, как кто-то меня макал в неумение опознавать это на глаз
Я такую ерунду не помню. Я просто знаю, что документация давным-давно разъясняет, когда хинт "игнорируется" (просто из-за того, что нет чёткого "memory location").
booby
Но такая гарантия мгновенной изменчивости приемника не имеет ничего общего с обещанием всегда оставить входной параметр в исходном значении при возникновении ошибки.
Ты начинаешь противоречить сам себе (и документации). initial<>undetermined

Я бы эту детскую боязнь сравнил с древней страшилкой, что когда-нибудь '' is null станет false.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133757
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что касается качества документации, то она, к сожалению, только ухудшается. Многие упоминания про 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.
CREATE OR REPLACE PROCEDURE p (x OUT INTEGER, y OUT INTEGER) AS
BEGIN
  x := 17; y := 93;
END;
/

На самом деле тут должно было быть приблизительно следующее:Может в какой-нибудь версии исправят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.
CREATE OR REPLACE PROCEDURE p (x OUT INTEGER, y OUT INTEGER) AS
BEGIN
  x := 17; y := 93;
END;
/
declare
  z integer;
begin
  p(z, z);
  dbms_output.put_line(z);
end;
/

Я лет 10 назад много раз убеждал Стивена, что это именно "are undefined". Похоже, что он согласился и донёс это тогда до Bryn Llewellyn. Но в документацию это попало в такой вот уё$ищной форме :(
То же касается out-ов в EI.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133761
booby
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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/

(Я не прочитал, что поэтому поводу есть у автора обсуждаемой книжки)
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40133765
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
booby
Процедура с nocopy хинтом пишется один раз, а используется многократно и в разных условиях.
В одних условиях вызова передача параметра произойдет по ссылке, в других будет образована копия в созданной для этой цели временной переменной.
Если я правда собрался натягивать вокруг "гарантий" логику, я должен быть уверен, что в каждом случае, когда мне приспичило ей воспользоваться, она точно работает.
Тут всё просто. nocopy является частью контракта. Если вызывающий хочет получить от неё "всё", то просто должен соблюсти условия.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40134034
konaz_714
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Предлагаю вернуться к 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 вот отсюда .
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40134843
konaz_714
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот на всякий случай текст книги по PL/SQL в формате Microsoft Word.
...
Рейтинг: 0 / 0
Нужна книга по изучению PL/SQL
    #40134913
SQL*Plus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
konaz_714
Вот на всякий случай текст книги по PL/SQL в формате Microsoft Word.

Скачал.
Спасибо.
...
Рейтинг: 0 / 0
17 сообщений из 67, страница 3 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Нужна книга по изучению PL/SQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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