powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / передача массива в процедуру ASE 12.5.4
5 сообщений из 5, страница 1 из 1
передача массива в процедуру ASE 12.5.4
    #38008570
Apucmokpam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто-нибудь в здравом уме и трезвой памяти может объяснить результат, который выдает 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.
drop procedure A
go
create procedure A
as begin
  if 
    --1=0 begin 
    isNull(object_id('#B'),0)<=0 begin
    declare @msg varchar(30)
    select @msg = 'i m here "' + convert(varchar(30), object_id('#B'))+'"'
    print @msg
    create table #B ( c int)
   end
  select object_id('#B')
  select * from #B
end
go
create table #B ( c int)
go
insert into #B (c) values (1)
go
exec A
go
select object_id('#B')
go
drop table #B
go



Собственно результат:

ASE12.5.4i m here ""

column1
----------
1124819145
1 record(s) selected

c
----
0 record(s) selected

column1
----------
1108819088
1 record(s) selected


То есть на входе в процедуру он думает, что таблицы нет. ПОЧЕМУ?
...
Рейтинг: 0 / 0
передача массива в процедуру ASE 12.5.4
    #38008629
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что это две разные #B.
Когда процедура запускается, сервер создает для нее отдельную session, а так как у временных таблиц в имени всегда (хоть и неявно) присутсвует номер сеанс, то времянки созданные внутри процедуры совершенно отдельны от времянок созданных в вызвавшем коннекте.
Читай: http://infocenter.sybase.com/help/topic/com.sybase.infocenter.dc36271.1550/html/blocks/X16231.htm
...
Рейтинг: 0 / 0
передача массива в процедуру ASE 12.5.4
    #38008659
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Apucmokpam,

Это временная таблица, # -- обозначает именно это. Это значит, она уникальна внутри области её использоватния (процедура или сессия) и сама удаляется.
Как только управление попадает в процедуру, в ней создаётся другая временная таблица, имя которой для кода выглядит как '#B'.
...
Рейтинг: 0 / 0
передача массива в процедуру ASE 12.5.4
    #38009325
Apucmokpam
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за ответы. Что она временная я конечно знаю. Непонятно про область использования.

Если сделать так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table #B ( c int)
go
drop procedure A
go
create procedure A
as begin
  select object_id('#B')
end
go
exec A
go
select object_id('#B')
go
drop table #B
go



то object_id('#B') будет одинаковым как в процедуре так и вне её.
...
Рейтинг: 0 / 0
передача массива в процедуру ASE 12.5.4
    #38010470
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ApucmokpamЕсли сделать так
....
то object_id('#B') будет одинаковым как в процедуре так и вне её.
Все просто на самом деле. Физически это происходит так: сервер ищет таблицу #B которая имеет номер текущей сессии в качестве суффикса. Нашел? Хорошо. Не нашел - берет родительскую сессию и повторяет поиск. И повторяет по кругу пока не найдет либо не достигнет сессии уровня коннекта. Если в этой сессии #B не была создана - только тогда ругаться что таблица не существует.
Это классическая схема областей видимости переменных в таких языках как С.

А область использования - у тебя может быть ХП которая вызывает другую ХП, которая вызывает третью и тд... Каждая из них может иметь какие-то #B для своих внутренних нужд. Но если тебе вдруг надо обработать таблицу созданную в ХП_i на уровне ХП_{i+1} то тоже запросто. Конечно в этом случае надо учитывать что эта ХП на уровне i+1 не должна перекрывать таблицу созданную родителем.
Короче говоря, вспоминай С, С++, Java и их потомков. Как работает область видимости переменных там, точно так же работает область существания временных таблиц тут.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / передача массива в процедуру ASE 12.5.4
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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