|
передача массива в процедуру ASE 12.5.4
|
|||
---|---|---|---|
#18+
Кто-нибудь в здравом уме и трезвой памяти может объяснить результат, который выдает ASE 12.5.4 вот на такой запрос: Код: sql 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.
Собственно результат: ASE12.5.4i m here "" column1 ---------- 1124819145 1 record(s) selected c ---- 0 record(s) selected column1 ---------- 1108819088 1 record(s) selected То есть на входе в процедуру он думает, что таблицы нет. ПОЧЕМУ? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2012, 17:33 |
|
передача массива в процедуру ASE 12.5.4
|
|||
---|---|---|---|
#18+
Потому что это две разные #B. Когда процедура запускается, сервер создает для нее отдельную session, а так как у временных таблиц в имени всегда (хоть и неявно) присутсвует номер сеанс, то времянки созданные внутри процедуры совершенно отдельны от времянок созданных в вызвавшем коннекте. Читай: http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36271.1550/html/blocks/X16231.htm ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2012, 18:01 |
|
передача массива в процедуру ASE 12.5.4
|
|||
---|---|---|---|
#18+
Apucmokpam, Это временная таблица, # -- обозначает именно это. Это значит, она уникальна внутри области её использоватния (процедура или сессия) и сама удаляется. Как только управление попадает в процедуру, в ней создаётся другая временная таблица, имя которой для кода выглядит как '#B'. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.10.2012, 18:17 |
|
передача массива в процедуру ASE 12.5.4
|
|||
---|---|---|---|
#18+
Спасибо за ответы. Что она временная я конечно знаю. Непонятно про область использования. Если сделать так Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
то object_id('#B') будет одинаковым как в процедуре так и вне её. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2012, 10:25 |
|
передача массива в процедуру ASE 12.5.4
|
|||
---|---|---|---|
#18+
ApucmokpamЕсли сделать так .... то object_id('#B') будет одинаковым как в процедуре так и вне её. Все просто на самом деле. Физически это происходит так: сервер ищет таблицу #B которая имеет номер текущей сессии в качестве суффикса. Нашел? Хорошо. Не нашел - берет родительскую сессию и повторяет поиск. И повторяет по кругу пока не найдет либо не достигнет сессии уровня коннекта. Если в этой сессии #B не была создана - только тогда ругаться что таблица не существует. Это классическая схема областей видимости переменных в таких языках как С. А область использования - у тебя может быть ХП которая вызывает другую ХП, которая вызывает третью и тд... Каждая из них может иметь какие-то #B для своих внутренних нужд. Но если тебе вдруг надо обработать таблицу созданную в ХП_i на уровне ХП_{i+1} то тоже запросто. Конечно в этом случае надо учитывать что эта ХП на уровне i+1 не должна перекрывать таблицу созданную родителем. Короче говоря, вспоминай С, С++, Java и их потомков. Как работает область видимости переменных там, точно так же работает область существания временных таблиц тут. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.10.2012, 18:42 |
|
|
start [/forum/topic.php?fid=55&fpage=13&tid=2010054]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
64ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 162ms |
0 / 0 |