powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Константы в СКЛ
5 сообщений из 5, страница 1 из 1
Константы в СКЛ
    #33565059
Евгений_СТ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли на сервере АСА (вер. 9) задавать константы? Чтобы писать не

Код: plaintext
1.
2.
3.
4.
select  1  as тип, 'улица' as название
union
select  2  as тип, 'область' as название
union
select  3  as тип, 'регион' as название;

а более надёжное и понятное:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
??? const тип_Улица =  1 ;
??? const тип_Область =  2 ;
??? const тип_Регион =  3 ;

select тип_Улица as Тип, 'улица' as Название
union
select тип_Область as Тип, 'область' as Название
union
select тип_Регион as Тип, 'регион' as Название;

Вот как-то так?
...
Рейтинг: 0 / 0
Константы в СКЛ
    #33565087
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
// Делаем хранимую процедуру инициализации сессии:
CREATE PROCEDURE dba.sp_Init ()
BEGIN
  // Инициализация системных функций БД
  CALL sp_login_environment ();

  CREATE VARIABLE type_Street tinyint;
  SET type_Street =  1 ;

  CREATE VARIABLE type_Area tinyint;
  SET type_Area =  2 ;

  CREATE VARIABLE type_Region tinyint;
  SET type_Region =  3 ;
END;

// Устанавливаем ее на подключение
SET OPTION PUBLIC.LOGIN_PROCEDURE = 'dba.sp_Init';
Теперь при подключении сессии сразу же будет вызвана эта процедура и таким образом в любом месте сессии можно будет обращаться к этим переменным, естественно если их где то не дропнут. При желании можно проявить фантазию и к примеру сделать табличку констант с полями Name, Type и Value, а в процедуре инициализации создавать их через динамический SQL, что то типа:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
DECLARE @SQL long varchar;

SELECT List(
  'CREATE VARIABLE ' || Name || ' ' || Type || ';' ||
  'SET ' || Name || ' = ' || Value || ';', '\n')
INTO @SQL
FROM Constants;

EXECUTE IMMEDIATE WITH RESULT SET OFF @SQL;
Здесь в Value стринговый тип нужно будет хранить в кавычках, однако при таком подходе вместо значений констант можно будет хранить любые выражения, например инициализировать константу-переменную вызовом нужной функции.

Единственное, что при таких подходах стоит помнить - во первых сессия не увидит изменений, во вторых глобальные переменные можно использовать в DEFAULT и CHECK, но очень не желательно - так как при перегрузке БД скрипт выбросит с ошибкой, что их еще не существует, здесь лучше это выносить в триггеры.
...
Рейтинг: 0 / 0
Константы в СКЛ
    #33565214
Евгений_СТ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Понятно. Наверное, всё-таки буду пользоваться просто непосредственными числовыми значениями. Так проще.
...
Рейтинг: 0 / 0
Константы в СКЛ
    #33565581
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Никто не мешает буквенными значениями пользоваться и хранить их в полях таблицы. К примеру что int 4 знака занимает, что char(4), однако 'УЛ' и 'ОБЛ' в коде и запросах выглядят гораздо нагляднее, чем 1 и 2. Так же никто не мешает домен сделать, куда сразу вписать CHECK IN ('УЛ', 'ОБЛ', 'РЕГ'), обьявлять поля на этот домен в таблицах и в коде при необходимости обьявлять переменные на этот домен.
...
Рейтинг: 0 / 0
Константы в СКЛ
    #33565662
Евгений_СТ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про символьные константные значения я тоже думал. Примерно так и рассуждал: объявить домен, в чеке которого перечислить все допустимые значения. А в таблице использовать поле типа этого домена.

Правда, я не знаю, насколько "тяжелее" АСА выполняет операции сравнения символьных констант, чем числовых.

Кроме того, это поле "Тип" мне необходимо для того, чтобы делать по нему сортировку. То есть в селекте должны идти сперва все регионы, потом все области, потом все улицы. С числовыми константами это сделать легко. А с символьными придётся лепить нечто вроде такого:

Код: plaintext
create domain Тип char( 4 ) check ('1УЛ', '2ОБЛ', '3РЕГ');

Не очень-то красиво.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Константы в СКЛ
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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