powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA-как поступить? Одно черное в белый горох, другое - белое в черный
14 сообщений из 14, страница 1 из 1
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32718852
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Задачка такая есть.
Существует таблица с ключами (хэш ключей). Есть функция getkey(), которая инкрементирует значение ключа и возвращает новое значение.

Так вот. Часто приходится получать ключи, но, к сожалению, не могу понять - как это сделать из процедуры. Т.е. если в некоей процедуре сделать так:

Код: plaintext
1.
2.
3.
4.
5.
6.
insert into dba.newnames
select getkey() as newkey, 
         name,
         lastname,
         age 
from dba.names

то все newkey'и получат одно и то же значение ключа. Я так понимаю, что изменения в хеше ключей не Commit'ятся после первого вызова функции. Commit в самой функции не помогает, да и нежелателен он - мало ли что дальше произойдет.

Приходится пихать данные во временную таблицу, бегать курсором по ней и получать в цикле ключи. Так работает (почему-то)

Что можно придумать, чтобы функция ВСЕГДА возвращала правильный ключ? Или это невозможно в принципе? Атомарная операция?
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32718947
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать NEWID() вместо getkey()?
Можно попробовать запихнуть NEWID() или NOW() внутрь твоей getkey(), впрочем не уверен что поможет.
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719038
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
CREATE FUNCTION GetKey ()
RETURNS varchar( 50 )
NOT DETERMINISTIC  // Отключает кэширование функции 
BEGIN
   // ... 
END;
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719182
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NOT DETERMINISTIC, говоришь?

ээээ... у меня этой опции АСА еще нет. Другие варианты есть?
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719302
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте сделать в функции GetKey() параметр и передавать туда любое поле с запроса. Тогда по идее ASA должна сообразить, что функцию нужно вызывать для каждой записи. Если не сообразит, значит нужно все как есть оставить на курсорах.
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719318
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Параметр там уже есть (мне же неинтересно получать новые ключи только для одной таблицы, таблиц-то много :)

К сожалению, не работает :(

А как воообще народ делает? Может, есть более гибкие решения с хэшем ключей? Или все юзают автоинкременты? (ни за что не поверю!)
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719378
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно попробовать вставить GetKey() в DEFAULT столбца таблицы и не указывать его в INSERT. Если в Вашей версии ASA поддерживается инициализация полей в триггерах BEFORE INSERT, то можно в таком триггере инициализировать поле значением этой функции.

авторА как воообще народ делает? Может, есть более гибкие решения с хэшем ключей? Или все юзают автоинкременты? (ни за что не поверю!)
Именно юзаю инкременты :) Если сильно бы прижало, то использовал бы GUID, но с хэшем ключей не стал бы связываться, по моему больше геммора, чем толку.
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719446
L0cat0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
NOT DETERMINISTIC появился в 8.0.3
чтобы заставить коректно генерировать ключи ранее приходилось передавать как параметр уникальное значение по текущей выборке(чтобы оно менялось от записи к записи) и впринципе не важно что, главное его изменение, что вызывало перезагрузку функции
Удачи !
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719546
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или все юзают автоинкременты?
Именно их мы и юзаем :). "Зачем делать сложным, что проще простого".
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32719549
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L0cat0rNOT DETERMINISTIC появился в 8.0.3
8.0.1 (RTFM :)).
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32720882
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
L0cat0r, большое спасибо, этот способ действительно работает.

Я добавил этой функции параметр dummy и передаю Number(). Все заработало.

Интересно, а как вы до этого дошли? Методом научного тыка или дедуктивно, изучая документацию?
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32722269
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mustliveЯ добавил этой функции параметр dummy и передаю Number(). Все заработало.
Кстати, о какой версии ASA идёт речь? Или это Очень Страшная Тайна ?

Интересно, а как вы до этого дошли? Методом научного тыка или дедуктивно, изучая документацию?
А какое ещё есть объяснение для ситуации "функция должна вызываться много раз, но вызывается один раз"?
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32723056
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Кстати, о какой версии ASA идёт речь? Или это Очень Страшная Тайна ?


5-я. Но мне кажется, это работает (или не работает, смотря с какой точки зрения смотреть) и в более новых. Если не использовать NOT DETERMINISTIC.

автор
А какое ещё есть объяснение для ситуации "функция должна вызываться много раз, но вызывается один раз"?


Не знаю. Не путайте, она вызывается не один раз, т. е. честно отрабатывает. Если вставить например message в ее тело и вызвать ее в цикле, то сообщение будет честно вылезать на каждый вызов.
...
Рейтинг: 0 / 0
ASA-как поступить? Одно черное в белый горох, другое - белое в черный
    #32723360
L0cat0r
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mustlive
автор
А какое ещё есть объяснение для ситуации "функция должна вызываться много раз, но вызывается один раз"?


Не знаю. Не путайте, она вызывается не один раз, т. е. честно отрабатывает. Если вставить например message в ее тело и вызвать ее в цикле, то сообщение будет честно вылезать на каждый вызов.

Похоже что при работе с функцией для ускорения ASA кеширует где-то (?)последние входящие переменные и результат, и если новый вызов происходит по закешированным входящим - то исходящий результат берется из кеша (?!!)

Вызов в цикле даст message, а вот на выборке его даст только точка входа (первая запись) или изменение вх. параметра

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


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